web-dev-qa-db-fra.com

RecyclerView: obtenez la position et passez à l'activité

Comment est-il possible d'obtenir la position de l'élément sur lequel vous avez cliqué dans la ligne RecyclerView et de créer une intention pour une activité dans la méthode onClick? Voici mon adaptateur:

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

        }
    }

Ici, j'ai juste un onClick quand une des images a été cliquée, mais chaque image a la même intention.

17
SerOsDeveloper

Vous pouvez obtenir la position de ViewHolder en utilisant la méthode getAdapterPosition(). Comme dans le code ci-dessous:

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

        }
    }
}
58
Konrad Krakowiak

ou vous pouvez simplement ajouter:

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.");
                }
            });
        }


    }
1
Joolah

Dans votre onClick(View v) vous pouvez simplement appeler getLayoutPosition() qui retournera la position où le clic s'est produit. Consultez le documents officiels pour plus d'informations.

Votre code ressemblerait donc à ceci:

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

De préférence, vous devez utiliser une interface pour gérer le clic.

1
reVerse