RecyclerView: получить позицию и переключиться на активность

Как можно получить позицию элемента, который был нажат в строке RecyclerView, а затем сделать намерение для действия в методе onClick? Вот мой адаптер:

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

        }
    }

Здесь у меня просто есть onClick, когда одно из изображений было нажато, но каждое изображение имеет одно и то же намерение.


person SerOsDeveloper    schedule 11.01.2015    source источник
comment
Проверьте это сообщение: stackoverflow.com/questions/26830505/. Он включает в себя некоторые из этих вещей.   -  person Alex K    schedule 12.01.2015
comment
getPosition() устарела. Вы должны использовать getLayoutPosition() или getAdapterPosition(). Для справки developer.android.com/reference/android/ поддержка/v7/виджет/   -  person Kavin Prabhu    schedule 16.04.2015


Ответы (3)


Вы можете получить позицию из ViewHolder, используя метод getAdapterPosition(). Как в коде ниже:

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

        }
    }
}
person Konrad Krakowiak    schedule 11.01.2015
comment
Спасибо за быстрый ответ! Я сделал это с корпусом переключателя, работает нормально. - person SerOsDeveloper; 11.01.2015
comment
Учтите, что установка положения вручную является избыточной или, точнее, ненужной работой. - person reVerse; 11.01.2015
comment
Это не правильно. Во-первых, у ViewHolder уже есть позиция, поэтому вам не нужно ее добавлять. Во-вторых, позиция onBind может не совпадать с позицией во время onClick (если элементы перемещаются). Вместо этого используйте ViewHolder#getPosition, чтобы получить актуальную позицию. - person yigit; 12.01.2015
comment
Я не могу удалить свой ответ, поэтому я отредактировал его на правильный ответ. Мое решение работает, но это намного лучше. Спасибо - person Konrad Krakowiak; 12.01.2015
comment
getPosition() теперь устарело и заменено на getAdapterPosition() - person dzikovskyy; 05.07.2015
comment
getAdapterPosition() Работает :) - person Pratik Butani; 13.08.2015
comment
@Konrad Krakowiak, даже в onClick() это даст идеальное положение? Даже если setTag() и getTag() не используются? - person Jimit Patel; 28.11.2016
comment
@JimitPatel вам не следует использовать setTag() getTag(), если вы хотите кэшировать значение в держателе представления, просто создайте член в держателе представления и установите значение для этого члена - person Konrad Krakowiak; 28.11.2016

или вы можете просто добавить:

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


    }
person Thiago    schedule 16.10.2015

В вашем onClick(View v) вы можете просто вызвать getLayoutPosition(), который вернет позицию, в которой произошел щелчок. Ознакомьтесь с официальной документацией. для дополнительной информации.

Итак, ваш код будет примерно таким:

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

Предпочтительно использовать интерфейс для обработки щелчка.

person reVerse    schedule 11.01.2015
comment
getPosition() устарел. Вместо этого используйте getAdapterPosition(). - person Joaquin Iurchuk; 13.01.2016
comment
@joaquin Вместо getPosition() у нас теперь есть getLayoutPosition() и getAdapterPosition(). Если вы хотите получить такой же эффект, вы должны вызвать getLayoutPosition(), так как он сопоставляется с той же заглушкой метода. getAdapterPosition() делает что-то другое. - person reVerse; 13.01.2016
comment
спасибо за данные. Я думал, что getAdapterPosition() имеет тот же эффект. - person Joaquin Iurchuk; 13.01.2016
comment
@joaquin Я бы сказал, что в 99% случаев он вернет одно и то же значение, но это то, что говорится в документации для getAdapterPosition(): Обратите внимание, что это может отличаться от getLayoutPosition(), если есть ожидающие обновления адаптера, но новый передача макета еще не произошла. - person reVerse; 13.01.2016