我有一个简单的ListView和上下文菜单。 当我动态添加项目时,我还想在适配器中添加setOnClickListener()。
我想要的是:短击应该触发setOnclickListener并长按fireCreateContextMenu。
但是当我向项目添加点击监听器时,上下文菜单不再起作用了。
使用ListView的MainActivity:
public class MainActivity extends ListActivity {
public static final String NOTES_ARRAY = "notesArray";
public static final String NOTE_ADAPTER = "noteAdapter";
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_main);
final ArrayList<Note> notes = new ArrayList<>();
final NoteAdapter adp = new NoteAdapter(this, notes);
setListAdapter(adp);
registerForContextMenu(getListView());
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
Log.i("clicked something", "really clicked");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_note, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Log.i("id", String.valueOf(info.position));
switch (item.getItemId()) {
case R.id.item_delete:
Log.i("wow", "clicked delete");
return true;
case R.id.item_reset:
Log.i("wow", "clicked reset");
return true;
default:
return super.onContextItemSelected(item);
}
}
}
适配器:
class NoteAdapter extends BaseAdapter implements Parcelable {
private Context context;
private ArrayList<Note> notes;
public NoteAdapter(Context context, ArrayList<Note> notes) {
this.context = context;
this.notes = notes;
}
@Override
public int getCount() {
return notes.size();
}
@Override
public Object getItem(int position) {
return notes.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = (View) inflater.inflate(R.layout.event_list_item, null);
}
TextView name = (TextView) convertView.findViewById(R.id.whatUserDid);
TextView date = (TextView) convertView.findViewById(R.id.whenUserDid);
name.setText(notes.get(position).getName());
date.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.i("date", "clicked");
}
});
return convertView;
}
/* Code below makes class Parcelable */
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(context);
dest.writeList(notes);
}
public static Creator<NoteAdapter> CREATOR = new Creator<NoteAdapter>() {
@Override
public NoteAdapter createFromParcel(Parcel source) {
return new NoteAdapter(source);
}
@Override
public NoteAdapter[] newArray(int size) {
return new NoteAdapter[size];
}
};
private NoteAdapter(Parcel parcel) {
this.context = (Context).readValue(Context.class.getClassLoader());
this.notes = (ArrayList).readValue(ArrayList.class.getClassLoader());
}
}
所以,如果我长按“日期”,那么上下文菜单就可以了。如果在“名称”上,那么它不起作用。 我做错了什么?