如何从自定义ListView中的PopupMenu获取项目的位置

这是问题:我有一个自定义的ArrayAdapter(覆盖getView)。 每个项目都有

  • 2 ImageView
  • 2 EditText

其中一个ImageView是可点击的并启用了PopupMenu,因此我为列表中的每个项目都有一个PopupMenu。 现在,对于该菜单,我需要从项目到锚定的一些参数。 那么,如何将信息(如位置)传递给从PopupMenu语音调用的方法? 附上了xml文件。

item_list.xml

         

menu_item.xml

      

CustomArrayAdapter.java

 public class CustomArrayAdapter extends ArrayAdapter{ private final Context context; private final List values; private final int resource; private final ImageCache imgCache = new ImageCache(); public CustomArrayAdapter(Context context, int resource, List values) { super(context, resource, values); this.context = context; this.values = values; this.resource = resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh; Custom Custom = values.get(position); if (convertView == null) { vh = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(resource, parent, false); vh.title = (TextView) convertView.findViewById(R.id.firstLine); vh.author = (TextView) convertView.findViewById(R.id.secondLine); vh.albumImage = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(vh); } else { vh = (ViewHolder)convertView.getTag(); } vh.requestedCustom = Custom; vh.title.setText(Custom.getTitle()); vh.author.setText(Custom.getAuthor()); String imgUrl = Custom.getImgUrl(); if (imgUrl != null) { imgCache.getImage(Custom, vh); } else { vh.albumImage.setImageResource(R.drawable.no_album); } return convertView; } // This is a ViewHolder that helps in the view recycling public static class ViewHolder { public Custom requestedCustom; public TextView title; public TextView author; public ImageView albumImage; } } 

“预览”和“下载”方法需要来自相关列表项的参数,我不知道如何获取它们。 再次感谢。

编辑1

似乎应该使用上下文菜单(对吧?)但我想将它作为一种出现的popup菜单锚定到每个项目。 那我该怎么做呢? 对于那些不理解我想要的人(由于我的英语最差):谷歌播放应用程序,popup菜单,让您在“安装”或“添加到威士忌”之间进行选择。

你可以像这样创建你的监听器类:

 class myClickListener implements OnClickListener, OnMenuItemClickListener { long id; public myClickListener(long id) { this.id = id; } @Override public void onClick(View v) { PopupMenu popup = new PopupMenu(appContext, v); popup.setOnMenuItemClickListener(this); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.menu_item, popup.getMenu()); popup.show(); } @Override public boolean onMenuItemClick(MenuItem arg0) { Toast.makeText(appContext, "ID of selected row : " + id , Toast.LENGTH_SHORT).show(); return false; } } 

并在适配器类的覆盖getView方法中将此侦听器添加到imageview:

 imageView.setOnClickListener(new myClickListener(getItemId(position))); 

我们只需将按钮标记设置为其位置,然后单击要获取视图所需的PopupButton:

 button.setTag(position); //may be you can call this on getview method of list view button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { int position = (Integer) v.getTag(); // you will get the position } }); 

或者在片段中使用Interface实现View.OnClickListener

 private void showPopupMenu(View view) { final int position = (Integer) view.getTag(); PopupMenu popup = new PopupMenu(getActivity(), view); // Inflate our menu resource into the PopupMenu's Menu popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); // Set a listener so we are notified if a menu item is clicked popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.menu_remove: System.out.println(position); return true; } return false; } }); // Finally show the PopupMenu popup.show(); } 

使用XML声明的onClick无法实现您想要的function。 通过实际实现解决它的最简单方法是:

  • 在充气后为ImageView添加一个真正的点击监听器。 适配器内部。
  • 监听器应该是实现OnClickListener接口的自定义类
  • 您还应该为监听器提供一个额外的数据成员:包含ImageView的位置(行)。
  • 当监听器被激活时,它将不得不在将显示Dialog的活动上调用回调,然后监听器将传递该位置。

我是这样做的:

  1. 我没有将CustomHolder存储在CustomArrayAdaptergetView(int position,View convertView,ViewGroup parent)方法中的convertView标签中,而是存储了Custom对象本身。 我甚至没有使用持有人。

     convertView.setTag(getItem(position)); 

    (如果您确实需要存储ViewHolder,可以使用setTag(int key,Object tag)来存储多个标签)

  2. 当ImageView调用showMenu(视图视图)时,我使用view.getParent()来获取当前所选视图的父LinearLayout,该视图在其标记中包含我的Custom对象。

     View parent = (View) view.getParent(); 
  3. 在showMenu()之外我已经定义了一个公共属性来存储当前选中的项目,如下所示:

     public static Custom mSelectedItem; 
  4. 在showMenu()中,我将mSelectedItem设置为来自步骤2的父LinearLayout的getTag()。

     mSelectedItem = (Custom) parent.getTag(); 
  5. 最后,在onMenuItemClick(MenuItem menuItem)覆盖方法中,我使用mSelectedItem来确定当前选择的项目。

     Custom custom = mSelectedItem;