2017-12-06 15 views
0

私は上記の質問に対する回答を見つけようとしていますが、投稿は役に立たないようです。 リスト<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; 
    } 

そして、私は、ビューの位置を見つけるために、onClickListenerを持っているViewHolderは getLayoutPosition()を使ってクリックした:私は、データベースからリストなどのデータを取得する場所私はRecyclerViewアダプタを持っている

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)); 

     } 
    } 

インクリントを使用してアクティビティを生成するために、onClick()メソッド内のRecyclerViewAdapterのすべてのノートを持つnoteListが必要であることです。これについてどうすればいいですか?

+0

:代わりにViewHolderにOnClickListener実装するので、私はとして、(onBindViewHolderにRecyclerViewAdapterで)メソッドを、それを実装しました'getLayoutPosition()'の代わりに 'getAdapterPosition()'を使うべきです。レイアウトの位置とアダプタの位置は通常同期されますが、アダプタ内のアイテムが移動/変更され、recyclerviewにまだ更新を描画する機会がない場合は、レイアウトの位置が異なる値をレポートできます。 –

+0

@ BenP。それに気づいてくれてありがとう。 – waseefakhtar

答えて

0

解決策を1時間試した後、ここで私が解決したことがあります。あなたは(あなたがしているように見える)アダプタをバックアップするデータ構造へのインデックス位置を使用している場合

@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

関連する問題