繁体   English   中英

如何将长单击上下文菜单添加到列表项

[英]How to Add Long Click Context Menu To List Items

所以首先我初始化了我的listview并添加了registerForContextMenu(my_list)

chatLists = (ListView)findViewById(R.id.chatlist);
chatLists.setAdapter(new ContactListAdapter(this));
registerForContextMenu(chatLists);

然后我添加了OnCreateContextMenu

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    if (v.getId()==R.id.chatlist) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.list_context, menu);
    }
}

但是运行该应用程序后。当我长按任何列表项时,它没有显示任何上下文菜单。

您应该为上下文菜单注册LISTVIEW。

这是来源。

对于onCreate()

registerForContextMenu(lv);

并在长按期间访问所选项目:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
   if (v.getId() == R.id.lv) {
       ListView lv = (ListView) v;
       AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
       YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);

       menu.add("One");
       menu.add("Two");
       menu.add("Three");
       menu.add(obj.name);
   }
}

这是您可以使用的一些示例代码:

`

... onCreateView{
.....
notiList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    setListMultiSelectListener();
}


public void setListMultiSelectListener() {
    notiList.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            // clear your list selection here
            mAdapter.clearSelection();
        }

        @Override
        public boolean onCreateActionMode(final ActionMode mode, Menu menu) {
   // inflate your action menu here
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.delete_mode_menu, menu);
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            int id = item.getItemId();
            switch (id) {
            case R.id.action_select_all:
                if (mAdapter.isAllSelected()) {
                    mAdapter.clearSelection();
                    for (int i = 0; i < notiList.getAdapter().getCount(); i++) {
                        notiList.setItemChecked(i, false);
                    }
                } else {
                    mAdapter.selectAllItems();
                    for (int i = 0; i < notiList.getAdapter().getCount(); i++) {
                        notiList.setItemChecked(i, true);
                    }
                }
                break;
            case R.id.action_delete:
                mAdapter.deleteSelectedItems();
                mode.finish();
                break;
            }
            return true;
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            deletionMode = mode;
            if (checked) {
                nr = nr + 1;
                mAdapter.setNewSelection(position, checked);
            } else {
                nr = nr - 1;
                mAdapter.removeSelection(position);
            }
            if (mAdapter.isAllSelected()) {
                mode.getMenu().findItem(R.id.action_select_all).setIcon(R.drawable.check);
            } else {
                mode.getMenu().findItem(R.id.action_select_all).setIcon(R.drawable.uncheck);
            }
        }
    });
}

`

这是适配器:

public class NotificationListAdapter extends BaseAdapter {

private MainActivity context;
private Vector<MessageInboxBean> messagesList;
private DisplayImageOptions /* options, */ options1;
private ImageLoader imageLoader;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
private NotiItemHolder holder;
private boolean isHomeworkTab;
private LineColorPicker colorPicker;
private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();
int msgTypeId;

public NotificationListAdapter(MainActivity context, int msgTypeId, Vector<MessageInboxBean> messagesList, DisplayImageOptions options, boolean isHomeworkTab) {
    this.context = context;
    this.messagesList = messagesList;
    // this.options = options;
    options1 = new DisplayImageOptions.Builder()//
            .showImageOnLoading(R.drawable.default_teacher)//
            .showImageForEmptyUri(R.drawable.default_teacher)//
            .showImageOnFail(R.drawable.default_teacher)//
            .cacheInMemory(true)//
            .cacheOnDisk(true)//
            .considerExifParams(true)//
            .displayer(new RoundedBitmapDisplayer(0))//
            .build();
    this.isHomeworkTab = isHomeworkTab;
    this.msgTypeId = msgTypeId;
    imageLoader = ImageLoader.getInstance();
    imageLoader.init(ImageLoaderConfiguration.createDefault(context));
    if (this.messagesList == null) {
        messagesList = getMessagesList(this.msgTypeId);
    }
    // if (this.messagesList.size() == 0) {
    // messagesList = getMessagesList(this.msgTypeId);
    // }
}

public void setNewSelection(int position, boolean value) {
    mSelection.put(position, value);
    notifyDataSetChanged();
}

public boolean isPositionChecked(int position) {
    Boolean result = mSelection.get(position);
    return result == null ? false : result;
}

public Set<Integer> getCurrentCheckedPosition() {
    return mSelection.keySet();
}

public void removeSelection(int position) {
    mSelection.remove(position);
    notifyDataSetChanged();
}

public void clearSelection() {
    mSelection = new HashMap<Integer, Boolean>();
    notifyDataSetChanged();
}

public void selectAllItems() {
    mSelection = new HashMap<Integer, Boolean>();
    for (int i = 0; i < messagesList.size(); i++) {
        mSelection.put(i, true);
    }
    notifyDataSetChanged();
}

public boolean isAllSelected() {
    if (mSelection.size() == messagesList.size()) {
        return true;
    } else {
        return false;
    }
}

public void deleteSelectedItems() {
    ArrayList<Integer> notiIdAray = new ArrayList<Integer>();
    for (int i = 0; i < messagesList.size(); i++) {
        Boolean result = mSelection.get(i);
        boolean result1 = result == null ? false : result;
        if (result1) {
            notiIdAray.add(messagesList.get(i).getNotificationId());
        }
    }
    ((MessageInboxTable) AppDb.getInstance(context).getTableObject(MessageInboxTable.TABLE_NAME)).deleteData(notiIdAray, context);
    updateMessagesList(msgTypeId);
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return messagesList.size();
}

@Override
public Object getItem(int position) {
    return messagesList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@SuppressWarnings("deprecation")
@SuppressLint({ "NewApi", "InflateParams" })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.notification_list_item, null);
        holder = new NotiItemHolder();
        holder.dueDate = (TextView) convertView.findViewById(R.id.dueDateTxt);
        holder.date = (TextView) convertView.findViewById(R.id.date);
        holder.day = (TextView) convertView.findViewById(R.id.day);
        holder.title = (TextView) convertView.findViewById(R.id.title);
        holder.message = (TextView) convertView.findViewById(R.id.message);
        holder.subject = (TextView) convertView.findViewById(R.id.subject);
        holder.doneStatus = (TextView) convertView.findViewById(R.id.doneStatus);
        holder.sendersName = (TextView) convertView.findViewById(R.id.sendersName);
        holder.notiDate = (TextView) convertView.findViewById(R.id.notiDate);
        holder.sendersImg = (ImageView) convertView.findViewById(R.id.sendersImg);
        holder.statusImg = (ImageView) convertView.findViewById(R.id.statusImg);
        holder.star = (CheckBox) convertView.findViewById(R.id.star);
        holder.doneLayout = (LinearLayout) convertView.findViewById(R.id.done_layout);
        holder.endView = convertView.findViewById(R.id.endView);
        convertView.setTag(holder);
    } else {
        holder = (NotiItemHolder) convertView.getTag();
    }
    MessageInboxBean bean = messagesList.get(position);
    if (mSelection.get(position) != null) {
        convertView.findViewById(R.id.cal_img_layout).setBackgroundResource(R.drawable.calender_check);
        holder.dueDate.setVisibility(View.INVISIBLE);
        holder.date.setVisibility(View.INVISIBLE);
        holder.day.setVisibility(View.INVISIBLE);
    } else {
        if (bean.getDueDate().trim().length() > 0) {
            convertView.findViewById(R.id.cal_img_layout).setBackgroundResource(R.drawable.calender);
            holder.dueDate.setVisibility(View.VISIBLE);
            holder.date.setVisibility(View.VISIBLE);
            holder.day.setVisibility(View.VISIBLE);
            holder.date.setText(getDueDate(bean.getDueDate()));
            holder.day.setText(getDueDay(bean.getDueDate()));
        } else {
            convertView.findViewById(R.id.cal_img_layout).setBackgroundResource(R.drawable.calender_2);
            holder.dueDate.setVisibility(View.INVISIBLE);
            holder.date.setVisibility(View.INVISIBLE);
            holder.day.setVisibility(View.INVISIBLE);
        }
        if (isHomeworkTab) {
            holder.subject.setVisibility(View.VISIBLE);
            holder.doneLayout.setVisibility(View.VISIBLE);
        } else {
            holder.subject.setVisibility(View.GONE);
            holder.doneLayout.setVisibility(View.GONE);
        }
    }

    holder.title.setText(bean.getTitle());
    holder.message.setText(bean.getMessage());
    if (isHomeworkTab) {
        holder.subject.setText(getSubjectFromId(context, bean.getSubjectId()) == null ? "" : getSubjectFromId(context, bean.getSubjectId()));
        String colr = getSubjectColorFromId(context, bean.getSubjectId());
        if (colr != null) {
            setColorToImage(holder.subject, 1, colr, false);
        }
        if (bean.getStatus().equals("0")) {
            holder.doneStatus.setText("Not done");
            holder.doneStatus.setTextColor(context.getResources().getColor(R.color.text_light_grey));
            holder.statusImg.setImageResource(R.drawable.not_done);
        } else {
            holder.doneStatus.setText("Done");
            holder.doneStatus.setTextColor(context.getResources().getColor(R.color.app_theme_color));
            holder.statusImg.setImageResource(R.drawable.done);
        }
    }
    holder.notiDate.setText(getMessageDate(bean.getMessageDate()));
    if (bean.getStarred().equals("0")) {
        holder.star.setChecked(false);
    } else {
        holder.star.setChecked(true);
    }
    holder.sendersName.setText("~" + bean.getSender());
    // holder.notiDate
    imageLoader.displayImage(bean.getSenderPicURL(), holder.sendersImg, options1, animateFirstListener);

    holder.subject.setTag(position);
    holder.star.setTag(position);
    holder.doneLayout.setTag(position);
    holder.subject.setOnClickListener(subjectClick);
    holder.star.setOnCheckedChangeListener(starClick);
    holder.doneLayout.setOnClickListener(doneClick);
    if (position == getCount() - 1) {
        holder.endView.setVisibility(View.VISIBLE);
    } else {
        holder.endView.setVisibility(View.GONE);
    }
    return convertView;
}

class NotiItemHolder {
    TextView dueDate, date, day, title, message, subject, doneStatus, sendersName, notiDate;
    ImageView sendersImg, statusImg;
    CheckBox star;
    LinearLayout doneLayout;
    View endView;
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM