2016-04-30 123 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是由模板提供的靜態類。 它擁有/構建用於填充回收視圖的數據。