17

RecyclerView行でクリックされたアイテムの位置を取得し、onClickメソッドでアクティビティを行う方法はどうでしょうか?私はちょうど画像の一方がクリックされたonClickを持ってRecyclerView:位置を取得してアクティビティに切り替える

ここ
public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    private LayoutInflater inflater; 
    List<Information> data= Collections.emptyList(); 

    public SergejAdapter(Context context, List<Information> data){ 
     inflater = LayoutInflater.from(context); 
     this.data=data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.navigation_drawer_custom_row,parent,false); 
     MyViewHolder holder= new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current=data.get(position); 
     holder.title.setText(current.title); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      title= (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      icon.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Context context = itemView.getContext(); 
      Intent intent = new Intent(context, Ernaehrung.class); 
      context.startActivity(intent); 

     } 
    } 

が、すべての画像は、同じ意図を持っている: はここに私のアダプタです。

+0

は、この記事をチェックアウト:http://stackoverflow.com/questions/26830505/create-a-listview-with-selectable-rows-change-background-colorを-of-listview-rowsです。これにはこれらのもののいくつかが組み込まれています –

+3

getPosition()は非推奨です。 getLayoutPosition()またはgetAdapterPosition()を使用する必要があります。参考までにhttps://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html –

答えて

58

getAdapterPosition()メソッドを使用して、ViewHolderから位置を取得できます。同様に以下のコードで:内

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    ... 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 


     @Override 
     public void onClick(View v) { 
      // here you use position 
      int position = getAdapterPosition(); 
      ... 

     } 
    } 
} 
+0

すぐにお返事ありがとうございます!私はスイッチのケースでそれをした、うまく動作します。 – sergejdeveloper

+0

手動で位置を設定することは、冗長またはより具体的な不要な作業であることを考慮してください。 – reVerse

+2

これは間違っています。まず第一に、ViewHolderには既にポジションがあるため、追加する必要はありません。第2に、onBindがonClick中の位置と一致しない可能性があります(項目が移動した場合)。代わりに、 'ViewHolder#getPosition'を使用して最新の位置を取得してください。 – yigit

1

onClick(View v)あなたは、単に呼び出すことができますクリックが起こった位置を返しますgetLayoutPosition()。詳細についてはofficial docsを確認してください。

だからあなたのコードは次のようになります。

@Override 
public void onClick(View v) { 
    switch(getLayoutPosition()){ 
     //TODO 
    } 
} 

好ましく、あなたがクリックを処理するためのインタフェースを使用する必要があります。

+0

'getPosition()'は推奨されていません。代わりに 'getAdapterPosition()'を使用してください。 –

+1

@joaquin 'getPosition()'の代わりに 'getLayoutPosition()'と 'getAdapterPosition()'があります。同じ効果を得たい場合は、同じメソッドスタブにマップするので、 'getLayoutPosition()'を呼び出す必要があります。 'getAdapterPosition()'は何か違うことをします。 – reVerse

+0

データをありがとう。 getAdapterPosition()にも同じ効果があったと思います。 –

1

またはあなただけ追加することができます。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder > { 

... 
    class MyViewHolder extends RecyclerView.ViewHolder { 

     public MyViewHolder (View itemView) { 
      super(itemView); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG, "Element " + getAdapterPosition() + " clicked."); 
       } 
      }); 
     } 


    } 
関連する問題