2016-04-30 41 views
3

我已经尝试建立一个ContextMenu我RecyclerView当我做了longClick这项工作很好,但是当我试图在getMenuInfo才能访问他总是空,即使在onCreateContextMenuRecyclerView getMenuInfo总是空

我已经尝试此链接:

对于在MainActivity的registerForContextMenu

@Bind(R.id.rvFeed) 
RecyclerView   feed; 
------ 
feed.setAdapter(adapter); 
registerForContextMenu(feed); 

onCreateContextMenu实现:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    if (info == null) { 
     Log.d(TAG, "info == null"); 
    } 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu_drawer, menu); 
} 

而且onContextItemSelected

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    if (info == null) { 
     Log.d(TAG, "info == null"); 
    } 
    return super.onContextItemSelected(item); 
} 

main_menu_drawer

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_drawer_delete" 
     android:title="@string/menufeed_menu_asread" /> 
</menu> 

回答

1

从你的问题,我明白你想在回收视图中使用浮动上下文菜单。按照这个method

现在,由于您没有指定为什么要使用menuinfo,所以我将举一个例子说明您希望项目位置删除视图。

因为您的代码与this类似。

所有的解释都是参考第一行的链接。

当你长时间点击视图/项目时,onCreateContextMenu(...)被调用并且视图(被长时间点击)被发送,将该视图复制到视图持有者内的临时变量中。

主要部分: 您如何识别哪个列表项目/视图是? 为此,您可以为onBindHolder中的每个视图设置一个标签。

使用位置作为标记(虽然不是必需的)。

然后在我们保存在类ViewHolder中的临时视图上调用getTag()。

示例实现:

@Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 

     holder.tvName.setText(holder.name); 
     holder.tvName.setTag(position); 

    } 

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, 
       MenuItem.OnMenuItemClickListener { 
      private final TextView tvName; 
      private static final int DEL_ITEM_ID = 9116; 
      private View toRemoveView; 
      private String name; 
      public ViewHolder(View view) { 
       super(view); 
       tvName = (TextView) view.findViewById(R.id.list_item); 
       view.setOnCreateContextMenuListener(this); 


    } 

     @Override 
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
      menu.setHeaderTitle("Select action:"); 
      toRemoveView=v; 
      MenuItem item = menu.add(0, DEL_ITEM_ID,100,"Delete"); 
      item.setOnMenuItemClickListener(this); 
     } 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      switch (item.getItemId()) { 
       case DEL_ITEM_ID: 
        deleteRecord((Integer) toRemoveView.getTag()); 
        //notifyItemRemoved(...) -- your wish 
        return true; 
       default: 
        return false; 
      } 
     } 

注意我测试了这个时候项目的数量分别为2只,我删除了一个(工作得很好)。列表滚动时我还没有测试过。但是由于每个项目都被分配了一个唯一的标签(位置),所以它不应该真的引起任何麻烦。

我想我已经说清楚了。 如果我在某个地方错了,请纠正我。

更新: 你也可以调用getAdapterPosition()里面的viewholder类。我还没有尝试过它。

0

什么dark_escape建议不适合我的情况,但他建议getAdapterPosition()可以工作,并为我完成。这里有一个例子,我是如何将它用于filemanager进行删除的。 (跟进他的想法,他只是asumed正在被需要menueinfo删除项目或得到的物品信息)

在延长View.OnCreateContextMenuListener的ViewHolder我们覆盖:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    menu.setHeaderTitle("Select The Action"); 

    int indexOfItemClickedInList = getAdapterPosition(); 

    menu.add(0, indexOfItemClickedInList, 0, R.string.ContextMenuItemTitleTextDELETE); 
    // keep adding menu items with that AdapterPosition 
    // if u need it for the selected actions 
} 

香港专业教育学院创建来自AndroidStuido模板的MasterDetail。因此,我ViewHolder是在SimpleItemRecyclerViewAdapter声明和适配器是在活动,我现在重写此声明:

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    int itemid = item.getItemId(); // index of Item clicked in the List 
    String title = item.getTitle().toString(); // contextmenu choice text 

    // Here I use ifs on the title to see wich item has been chosen 
    if (title.equals(getApplicationContext().getResources().getString(R.string.ContextMenuItemTitleTextDELETE))) { 
     // Do things that require the item id - like moving photos... 
     // in this case I needed it to delete files 
     String fnameToDelete = DummyContent.ITEMS.get(itemid).fname; 
     MyStaticIOHelperClass.DeleteFileFromDisk(fnameToDelete , this); 

     // After actually removing the file 
     // I needed to cleanup the Data used by the recycler 
     DummyContent.ITEM_MAP.remove(DummyContent.ITEMS.get(itemid).fname); 
     DummyContent.ITEMS.remove(itemid); 

     // Rebuild the recycler view after this 
     // I basically call .setAdapter() on the recycler view in there 
     // creating the adapter new like I do in onCreate of this Activity 
     BuildRecycler(); 
    } 
} 


private void BuildRecycler(){ 
    View recyclerView = findViewById(R.id.trail_list); 
    assert recyclerView != null; 
    setupRecyclerView((RecyclerView) recyclerView); 
} 

DummyContent是由模板提供的静态类。 它拥有/构建用于填充回收视图的数据。