2017-01-03 7 views
0

Используя RecylcerView, я пытаюсь иметь контекстное меню для каждого элемента в списке, похожее на это:Как получить позицию RecyclerView из PopupMenu onMenuItemClick

Popup Menu in Google Play Music playlist.

Создание всплывающего меню просто , но как вы получаете позицию предмета, нажатого в onMenuItemClicked?

public class Activity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener { 

    public void showPopupMenu(View v) { 
     PopupMenu popupMenu = new PopupMenu(this, v); 
     MenuInflater inflater = popupMenu.getMenuInflater(); 
     inflater.inflate(R.menu.edit_delete_menu, popupMenu.getMenu()); 
     popupMenu.show(); 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem item) { 

     //get position here from RecyclerView here? 

     switch (item.getItemId()) { 
      case R.id.edit: 
      //Do position specific action 
      break; 
      case R.id.delete: 
       //Do position specific action 
       break; 
     } 
     return false; 
    } 


} 

ответ

0

Хорошо, поэтому я (удивительно) смог ответить на мой собственный вопрос здесь.

Для того, чтобы получить позицию из RecylcerView адаптера в onMenuItemClicked с помощью PopupMenu, я создал пользовательскую реализацию PopupMenu.

Это обеспечивает гораздо большую гибкость при использовании PopupMenu, например displaying icons in your menus.

Посмотрите на исходный код Google для PopupMenu и создайте свой собственный, что-то вроде MyPopupMenu, что точно так же, но вы можете изменить некоторые экземпляры того, что класс может сделать.

Чтобы решить эту проблему, я добавил OnClickListener к кнопке More в моем RecyclerView.Adapter. При нажатии кнопки вызывается метод интерфейса, который передает как представление кнопки, так и текущую позицию адаптера.

В пользовательской реализации MyPopupMenu добавьте требования к переменной для каждого конструктора для значения int. Также добавьте int position к способу интерфейса onMenuItemClick(MenuItem item, int position) в пределах MyPopupMenu.

Наконец, соберите в классе активности.

public class MyActivity extends AppCompatActivity implements MyAdapter.OnItemEventListener, PopupMenu.OnMenuItemClickListener { 

    @Override 
    public void onMoreClicked(View v, int position) { 
     MyPopupMenu popupMenu = new MyPopupMenu(this, v, position); 
     MenuInflater inflater = popupMenu.getMenuInflater(); 
     inflater.inflate(R.menu.edit_delete_menu, popupMenu.getMenu()); 
     popupMenu.setOnMenuItemClickListener(this); 
     popupMenu.show(); 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem item, int position) { 
     switch (item.getItemId()) { 
      case R.id.edit: 
       //Do position specific action with int position 
       break; 
      case R.id.delete: 
       //Do position specific action with int position 
       break; 
     } 
     return false; 
    } 
} 

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private final OnItemEventListener onItemEventListener; 

    static class ViewHolder extends RecyclerView.ViewHolder { 
     ImageButton more; 

     ViewHolder(View v) { 
      super(v); 
      more = (ImageButton) v.findViewById(R.id.list_item_more_button); 
     } 
    } 

    public NewGameAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     final ViewHolder viewHolder = new ViewHolder(v); 

     viewHolder.more.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       onItemEventListener.onMoreClicked(viewHolder.more, viewHolder.getAdapterPosition()); 
      } 
     }); 

     return viewHolder; 
    } 

    interface OnItemEventListener { 
     void onMoreClicked(View v, int position); 
    } 
} 

Дайте мне знать, что вы думаете, ребята!

0

Вам потребуется:

  1. Interface с одним из методов, которые имеют click position в parameter. Пример:

    public interface OnPositionClickListener { 
        void onPositionClicked(int position); 
    } 
    
  2. Implement что Interface в вашем activity и передать это ссылка на адаптере вашего RecyclerView. Таким образом, в вашей деятельности должна быть реализация методы, как это:

    @Override 
    public void onPositionClicked(int position) { 
        //show your popup here and do position based actions here 
    } 
    
  3. Pass click listener ссылки от адаптера к держателю вида и называют это метод от click listener из интерактивного пункта вашего зрения меню.

    Пример:

    public class SampleViewHolder extends RecyclerView.ViewHolder { 
        public SampleViewHolder(View view, OnPositionClickListener listener) { 
         //*** 
         //your view bind code here 
         // *** 
         clickableView.setOnClickListener(new OnClickListener { 
         @Override 
         public void onClick(View view) { 
          listener.onPositionClicked(getAdapterPosition()); 
         } 
        }); 
        } 
    } 
    
0

Во-первых, в фрагменте кода вы показали, что не соотносится с имеющимся изображением.

Просьба указать код onBindViewHolder. Именно там должен быть установлен элемент меню на клик-слушателе.