2017-12-06 1 views
0

위의 질문에 대한 답변을 찾으려고했지만 게시물이 도움이되지 않습니다. getLayoutPosition()를 사용하여 클릭 된 내가보기의 위치를 ​​찾기 위해 OnClickListener를이리스트 <E>을 RecyclerView 어댑터에서 RecyclerView 홀더로 전달하는 방법?

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> { 

    public List<Note> noteList; 
    private View.OnLongClickListener longClickListener; 
    private Context context; 

    public RecyclerViewAdapter(List<Note> noteList, View.OnLongClickListener longClickListener, Context context) { 
     this.noteList = noteList; 
     this.longClickListener = longClickListener; 
     this.context = context; 
    } 

그리고 ViewHolder :

static class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private TextView noteTitleText; 
     private TextView noteDescriptionText; 
     private TextView dateText; 
     private TextView weekText; 

     RecyclerViewHolder(View view) { 
      super(view); 

      noteTitleText = (TextView) view.findViewById(R.id.noteTitleText); 
      noteDescriptionText = (TextView) view.findViewById(R.id.noteDescriptionText); 
      dateText = (TextView) view.findViewById(R.id.dateText); 
      weekText = (TextView) view.findViewById(R.id.weekText); 

      view.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      int position = getLayoutPosition(); 

      // I want the noteList from the RecyclerViewAdapter here. 
      Note note = noteList.get(position); 

      Log.d("Item Clicked", String.valueOf(position)); 

     } 
    } 

의 I는 내가 데이터베이스에서 목록과 같은 데이터를 얻을 RecyclerView 어댑터가 목적은 의도를 사용하여 Activity를 채우는 onClick() 메소드의 RecyclerViewAdapter에서 모든 노트가있는 noteList가 필요하다는 것입니다. 이 문제를 어떻게 해결해야합니까?

+0

당신이 (당신이 것처럼 보이는) 어댑터를 백업 데이터 구조로 인덱스 위치를 사용하는 경우 getLayoutPosition() 대신에'getAdapterPosition()'을 사용해야한다. 레이아웃 위치와 어댑터 위치는 일반적으로 동기화되지만, 어댑터의 항목이 이동/변경되고 recyclerview가 업데이트를 아직 그리지 못한 경우 레이아웃 위치가 다른 값을보고 할 수 있습니다. –

+0

@BenP. 그 점을 알아 주셔서 고마워요. – waseefakhtar

답변

0

한 시간 동안 해결책을 시험해 본 후 여기에 내가 정한 것이 있습니다. 대신 ViewHolder에 OnClickListener를 구현하는, 내가 onBindViewHolder에 RecyclerViewAdapter에 구현() 메소드와 같은 :

@Override 
public void onBindViewHolder(final RecyclerViewHolder holder, final int position) { 
     final Note note = noteList.get(position); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // The note and noteList can be accessed here. 
      } 
     }); 
    } 
+0

컴파일러는 그렇게 할 수있어서 기쁩니다.하지만 Android 관점에서는 'position'을 final로 선언하는 것은 오류입니다. RecyclerView의 구현은 뷰 바인더가 다시 바인딩되지 않고 "이동"될 수 있으므로이 'position' 매개 변수는 뷰 소유자가 바인딩되는 순간에만 유효합니다. 'position' 매개 변수를 사용할 수 있음에도 불구하고 클릭 리스너 내에서 getAdapterPosition()을 사용하여 뷰 홀더의 위치를 ​​검색해야합니다. 수정 : 공식 성명서는 https://www.youtube.com/watch?v=imsr8NrIAMs @ 35:00를 참조하십시오. –

+0

@BenP. 이것을 공유해 주셔서 감사합니다! 그게 내가 위의 코드를 진행하기 위해 작동하는 유일한 방법이었습니다. 'noteList.get (position)'을'noteList.get (getAdapterPosition()) '으로 대체해야한다는 것을 의미합니까? – waseefakhtar

관련 문제