2017-01-03 11 views
0

에서 RecyclerView 위치를 얻는 방법 : 간단, 나는이 유사한 목록의 각 항목에 대한 팝업 메뉴를 가지고 노력하고 있어요 <code>RecylcerView</code>를 사용하여 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

좋아, 그래서 (놀랍게도) 나는 여기에 내 자신의 질문에 대답했다. PopupMenu를 사용 onMenuItemClicked 내에 RecylcerView 어댑터의 위치를 ​​얻기 위해

, 난 PopupMenu의 정의 구현을 만들었다.

displaying icons in your menus과 같이 PopupMenu을 사용할 때 유연성이 훨씬 뛰어납니다.

PopupMenu에 대한 Google의 소스 코드를보고 정확히 동일한 MyPopupMenu과 같이 자신 만의 클래스를 만들 수도 있지만 클래스가 수행 할 수있는 특정 인스턴스를 수정할 수 있습니다.

내 문제를 완료하려면 RecyclerView.Adapter에있는 자세히 단추에 OnClickListener을 추가했습니다. 이 버튼을 클릭하면 단추보기와 어댑터의 현재 위치를 모두 통과하는 인터페이스 메서드가 호출됩니다.

MyPopupMenu의 사용자 지정 구현에서 int 값에 대한 각 생성자의 변수 요구 사항을 추가하십시오. 또한 int positiononMenuItemClick(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

당신이 필요합니다 : parameter으로 click position이 그

  1. Interface 방법 하나. 예 :

    public interface OnPositionClickListener { 
        void onPositionClicked(int position); 
    } 
    
  2. Implement 당신의 activityInterface하고 당신의 RecyclerView의 어댑터를 참조 패스. 그래서, 활동 안에이 같은 방법을 구현해야한다 : 뷰 홀더 어댑터에서

    @Override 
    public void onPositionClicked(int position) { 
        //show your popup here and do position based actions here 
    } 
    
  3. 패스 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 코드를 제공해주십시오. 메뉴 항목을 클릭 리스너로 설정해야합니다.