0

RecyclerView行内のビューのクリックハンドラを設定します。フラグメントからアイテムのクリックを処理したい私はthis tutorialでコード化しようとしました。しかし、どのビューがクリックされたかを特定しようとすると-1が返されます。RecyclerVIew OnItemClick return -1

私は自分のアダプターにインターフェイスを持っています。

public interface OnItemClickListener { 
     void onItemClick(View itemView, int position); 
    } 
    public void setOnItemClickListener(OnItemClickListener listener) { 
     this.mOnItemClickListener = listener; 
    } 

その後ViewHolderコンストラクタ内で、私はこの呼び出し:ここ

itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (mOnItemClickListener != null) { 
         mOnItemClickListener.onItemClick(v, getLayoutPosition()); 
        } 
       } 
      }); 

そして最後によっては私のフラグメントからリスナーを設定する部分である:

mFollowingAdapter.setOnItemClickListener(new FollowingAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(View itemView, int position) { 
        Log.d(Constants.TAG, itemView.getId() + " " + position); 
      } 
     }); 

全VIewHolderコード:

public class ViewHolder extends RecyclerView.ViewHolder { 
     private ImageView request_author_profile; 
     private TextView request_name; 
     private ImageView request_accept; 
     private ImageView request_decline; 

     public ViewHolder(final View itemView) { 
      super(itemView); 
      request_author_profile = (ImageView) itemView.findViewById(R.id.profile_image); 
      request_name = (TextView) itemView.findViewById(R.id.request_name); 
      request_decline = (ImageView) itemView.findViewById(R.id.btn_request_decline); 
      request_accept = (ImageView) itemView.findViewById(R.id.btn_request_accept); 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (mOnItemClickListener != null) { 
         mOnItemClickListener.onItemClick(itemView, getLayoutPosition()); 
        } 
       } 
      }); 
     } 
    } 

助けてくれてありがとう。

+0

ViewHolderコードを投稿してください。 –

+0

何が-1ですか? IDまたは位置? – tachyonflux

+0

fuch viewholder code -1はIDです。位置は正常です。 –

答えて

0

匿名の中間リスナーを、getLayoutPosition()の代わりにonItemClick()にデータセット内のアイテムの位置を渡して、ViewHolderコンストラクタの代わりにonBindViewHolder()メソッドで設定してみてください。

ViewHolderの目的は、スクリーンに表示される単一のリスト項目を表し、最初はデータの基礎部分と無関係です。 onBindBiewHolder()メソッドは、項目を表示する必要がある間、データセット内の項目にバインドします。中間リスナーを設定すると、データセット内のアイテムの位置がクライアントリスナーに確実に渡されます。

ここでは簡単な例です:

アダプタ:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    public interface OnItemClickListener { 
     void onItemClick(int position); 
    } 

    /* this is the public listener that you set from the outside of the adapter */ 
    private OnItemClickListener mOnItemClickListener; 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 

     /* update the intermediate listener so that it passes 
     * the correct position to the public listener */ 
     holder.setOnClickListener(new OnClickListener() { 
      if (mOnItemClickListener != null) { 
       mOnItemClickListener.onItemClick(position); 
      } 
     } 
     /* ... */ 
    } 
    /* ... */ 
} 

ViewHolder:それは新しいリスナーを作成しますので、これは、非常に優れた実装の性能面に注意していることを

public class MyViewHolder extends RecyclerView.ViewHolder { 
    private View mView; 

    public MyViewHolder(final View itemView) { 
     mView = itemView; 
    } 

    /* delegate the setter to the (root) view */ 
    public setOnClickListener(OnClickListener listener) { 
     mView.setOnClickListener(listener); 
    } 
} 

注意ViewHolderがバインドされるたびにオブジェクトになりますが、そのアイデアをうまく​​伝えると思います。より良い解決策は、データセット内の位置を記述するフィールドをViewHolder内に保持し、それを中間リスナーで使用し、その値をonBindViewHolder()に更新することです。

+0

ありがとう、友人ですが、私は初心者ですが、どのようにしてlistenerをviewHolderに追加すればよいですか?スタンドアート法はありません。 ViewHolderクラスで作成し、bindVIewHolderで呼び出すことはできますか? –

+0

答えに実装例を追加しました。希望が役立ちます。 – SpaceBison

関連する問題