Если у меня есть тысячи элементов внутри представления recycler, то как я могу установить прослушиватель щелчков элемента для каждого элемента

#java #android #android-studio #android-recyclerview #onitemclick

#java #Android #android-studio #android-recyclerview #onitemclick

Вопрос:

 recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(
            this,
            recyclerView,
            new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    switch (position){
                        case 0:
                            Toast.makeText(MainActivity.this, "item-1 Clicked", Toast.LENGTH_SHORT).show();
                            break;
                        case 1:
                            Toast.makeText(MainActivity.this, "item-2 Clicked", Toast.LENGTH_SHORT).show();
                            break;
                        default:

                    }
                }

                @Override
                public void onLongItemClick(View view, int position) {
                    switch (position){
                        case 0:
                            Toast.makeText(MainActivity.this, "Get 10% Discount", Toast.LENGTH_SHORT).show();
                            break;
                        case 1:
                            Toast.makeText(MainActivity.this, "Get 20% Discount", Toast.LENGTH_SHORT).show();
                            break;
                        default:

                    }
                }
            }
    ));
}
  

Этот код лучше всего подходит, пока у меня есть только два или до 5 элементов в моем представлении recycler. Но что произойдет, если у меня были тысячи элементов внутри моего представления recycler, тогда как я могу использовать onClickItem или onLongItemClick, потому что использование оператора switch будет наихудшим случаем.

Ответ №1:

внедрите интерфейс внутри адаптера вашего RecycleView

Что-то вроде:

 public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ViewHolder> {

    private List<AccountTypeModel> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    Context context;


    // data is passed into the constructor
   public ProductListAdapter(Context context, List<AccountTypeModel> data, ItemClickListener mClickListener) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.context = context;
        this.mClickListener = mClickListener;
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.product_list_item_design, parent, false);
        return new ViewHolder(view);
    }

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

       AccountTypeModel currentItem = mData.get(position);
        holder.txtproductname.setText(currentItem.getAccountName());


    }

    // binds the data to the TextView in each row

    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends `RecyclerView.ViewHolder implements View.OnClickListener` {
        TextView txtproductname;
        ConstraintLayout relativeLayout;

        ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            txtproductname = itemView.findViewById(R.id.txtproductname);
            relativeLayout = itemView.findViewById(R.id.myItemLayout);

        }


    @Override
        public void onClick(View view) {
            if (mClickListener != null) {
                mClickListener.onItemClick(view, getAdapterPosition(), mData.get(getAdapterPosition()).getAccountID());
    
            }
            notifyDataSetChanged();

        }
    }
    // convenience method for getting data at click position
    public String getItem(int id) {
        return mData.get(id).getAccountID();
    }
    // allows clicks events to be caught
    public void setClickListener(ItemClickListener itemClickListener) {
       this.mClickListener = itemClickListener;
    }
      // parent activity will implement this method to respond to click events
        public interface ItemClickListener {
            void onItemClick(View view, int position, String name);
        }
}
  

Затем реализуйте onClick в своем классе Activity.