anber писал(а):А более детальный пример кода как этот листенер применять можно?
Конечно.
Для удобства сделал интерфейс:[syntax=java]public interface IContextedAdapter {
public void setOnContextButtonClickListener(OnContextButtonClickListener onContextButtonClickListener);
public interface OnContextButtonClickListener {
public void onContextButtonClick(AdapterContextMenuInfo menuInfo);
}
}[/syntax]
Вот сам класс реализующий его:
[syntax=java]public abstract class ContextedCursorAdapter<Holder> extends CursorAdapter implements IContextedAdapter {
private LayoutInflater mInflater;
private int mLayoutId;
private int[] mContextButtons;
private OnContextButtonClickListener mOnContextButtonClickListener;
public ContextedCursorAdapter(Context context, Cursor cursor, int layout, int[] contextButtons, int flags) {
super(context, cursor, flags);
mInflater = LayoutInflater.from(context);
mLayoutId = layout;
mContextButtons = contextButtons;
onCursorChanged(cursor);
}
abstract Holder newHolder(View view);
abstract void bindHolder(Holder holder, Cursor cursor);
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mInflater.inflate(mLayoutId, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ContextHolder contextHolder = (ContextHolder) view.getTag();
if(contextHolder == null) {
contextHolder = new ContextHolder();
contextHolder.viewHolder = newHolder(view);
view.setTag(contextHolder);
if(mContextButtons !=null) for(int id: mContextButtons) {
View contextButton = view.findViewById(id);
if(contextButton != null) {
contextButton.setOnClickListener(mContextButtonClickListener);
contextButton.setTag(contextHolder);
contextButton.setFocusable(false);
}
}
}
contextHolder.position = cursor.getPosition();
contextHolder.id = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
bindHolder(contextHolder.viewHolder, cursor);
}
@Override
public Cursor swapCursor(Cursor cursor) {
Cursor res = super.swapCursor(cursor);
onCursorChanged(cursor);
return res;
}
@Override
public void setOnContextButtonClickListener(
OnContextButtonClickListener onContextMenuButtonClickListener) {
mOnContextButtonClickListener = onContextMenuButtonClickListener;
}
void onCursorChanged(Cursor newCursor) {
}
private OnClickListener mContextButtonClickListener = new OnClickListener() {
@Override
public void onClick(View viev) {
ContextHolder contextHolder = (ContextHolder) viev.getTag();
handleContextButtonClick(viev, contextHolder);
}
};
private void handleContextButtonClick(View targetView, ContextHolder contextHolder){
if(mOnContextButtonClickListener != null) {
AdapterContextMenuInfo menuInfo = new AdapterContextMenuInfo(targetView, contextHolder.position, contextHolder.id);
mOnContextButtonClickListener.onContextButtonClick(menuInfo);
}
}
class ContextHolder {
int position;
long id;
Holder viewHolder;
}
}[/syntax]
Как пользоваться:
[syntax=java]public class ImplOfContextedCursorAdapter extends ContextedCursorAdapter<ImplOfContextedCursorAdapter.ViewHolder> {
public ImplOfContextedCursorAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, R.layout.list_item_layout, new int[] {R.id.checkbox, R.id.contextButton}, flags);
}
@Override
ViewHolder newHolder(View view) {
return new ViewHolder(view);
}
@Override
void bindHolder(ViewHolder holder, Cursor cursor) {
// Биндим холдер
}
class ViewHolder {
public final TextView text1;
//.... перечень полей
public ViewHolder(View view) {
text1= (TextView) view.findViewById(R.id.text1);
// ....
}
}
}[/syntax]
Непосредственное применение:
[syntax=java] ImplOfContextedCursorAdapteradapter = new ImplOfContextedCursorAdapter(getActivity(), cursor, 0);
adapter.setOnContextButtonClickListener(this);
//...
@Override
public void onContextButtonClick(AdapterContextMenuInfo menuInfo) {
switch (menuInfo.targetView.getId()) {
case R.id.checkbox:
// Что-то делаем
break;
case R.id.contextButton:
// А можем и меню показать
PopupMenu menu = new PopupMenu(getActivity(), menuInfo.targetView);
menu.inflate(R.menu.context_menu);
menu.setOnMenuItemClickListener(...);
menu.show();
break;
default:
// ...
break;
}
}[/syntax]
altwin писал(а):а в чем преимущество перед стандартным?
Я могу легко получить position и id из AdapterContextMenuInfo.
PS: Жду критики.