Как получить позицию элемента, когда я нажимаю на него в Recyclerview? - PullRequest
0 голосов
/ 05 мая 2020

Итак, в основном я создал recyclerview и добавил в него элементы, а также создал адаптер для того же

вот мой адаптер:

 public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<ExampleItem> mExampleList;
private OnItemClickListener mListener;

public interface OnItemClickListener {
    void onItemClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

public static class ExampleViewHolder extends RecyclerView.ViewHolder {

    public ImageView mImageView;
    public TextView mTextView1;
    public TextView mTextView2;

    public ExampleViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
        super(itemView);

        mImageView = itemView.findViewById(R.id.imageView);
        mTextView1 = itemView.findViewById(R.id.textView);
        mTextView2 = itemView.findViewById(R.id.textView2);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(position);
                    }
                }
            }
        });

    }
}

public ExampleAdapter(ArrayList<ExampleItem> exampleList) {
    mExampleList = exampleList;
}


@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);
    ExampleViewHolder evh = new ExampleViewHolder(v, mListener);
    return evh;
}

@Override
public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {

    ExampleItem currentItem = mExampleList.get(position);

    holder.mImageView.setImageResource(currentItem.getmImageResource());
    holder.mTextView1.setText(currentItem.getmText1());
    holder.mTextView2.setText(currentItem.getmText2());

}

@Override
public int getItemCount() {
    return mExampleList.size();
}

И это моя основная деятельность:

 private RecyclerView mRecyclerView;
private ExampleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ArrayList<ExampleItem> exampleList = new ArrayList<>();
    exampleList.add(new ExampleItem(R.drawable.ic_android, "Line 1", "Line 2"));
    exampleList.add(new ExampleItem(R.drawable.ic_audio, "Line 3", "Line 4"));
    exampleList.add(new ExampleItem(R.drawable.ic_sun, "Line 5", "Line 6"));
    exampleList.add(new ExampleItem(R.drawable.ic_android, "Line 7", "Line 8"));
    exampleList.add(new ExampleItem(R.drawable.ic_audio, "Line 9", "Line 10"));
    exampleList.add(new ExampleItem(R.drawable.ic_sun, "Line 11", "Line 12"));
    exampleList.add(new ExampleItem(R.drawable.ic_android, "Line 13", "Line 14"));
    exampleList.add(new ExampleItem(R.drawable.ic_audio, "Line 15", "Line 16"));
    exampleList.add(new ExampleItem(R.drawable.ic_sun, "Line 17", "Line 18"));


    mRecyclerView = findViewById(R.id.recyclerView);
    mRecyclerView.setHasFixedSize(true); // set it as true if you know that your recyclerview will not change in size

    mLayoutManager = new LinearLayoutManager(this);

    mAdapter = new ExampleAdapter(exampleList);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);

    mAdapter.setOnItemClickListener(new ExampleAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {


             exampleList.get(position);

            }



        });
    }

}

Моя проблема в основном заключается в том, что я хочу вернуть позицию элемента, нажатого в этом recyclerview, так что, как только я получу позицию, в соответствии с позицией или выбранным c элементом я могу просмотреть его содержимое в новом действии.

1 Ответ

1 голос
/ 05 мая 2020

В вашем ExampleViewHolder:

public static class ExampleViewHolder extends RecyclerView.ViewHolder {

public ImageView mImageView;
public TextView mTextView1;
public TextView mTextView2;

//add this
View view;


public ExampleViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
    super(itemView);

    //set it here
    view = itemView;

    mImageView = itemView.findViewById(R.id.imageView);
    mTextView1 = itemView.findViewById(R.id.textView);
    .......
    .......

В вашем adapter создайте конструктор, который принимает context

 public class ExampleAdapter extends . ........

 private Context context;
 ......
 ......

 //constructor
 public ExampleAdapter(.....,Context context){
   .........
   this.context = context;
 }

Передайте контекст конструктору из activity

//pass the context of the activity here
mAdapter = new ExampleAdapter(exampleList,getApplicationContext());
......
.....

В onBindViewHolder используйте context, чтобы открыть новое действие в соответствии с положением:

@Override
public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {

ExampleItem currentItem = mExampleList.get(position);

holder.mImageView.setImageResource(currentItem.getmImageResource());
holder.mTextView1.setText(currentItem.getmText1());
holder.mTextView2.setText(currentItem.getmText2());

//on click item 

holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

 if(position == 0){ 
 //first item clicked
 context.startActivity(new Intent(context, SomeActivity.class));

 }else if(position == 1){

 //second item clicked
 context.startActivity(new Intent(context, SomeActivity.class));

 }else if(position == 2){

 //third item clicked
 context.startActivity(new Intent(context, SomeActivity.class));

 }.......
  .......

}
});

}
...