RecyclerView OnClick not working

后端 未结 3 1168

I have made a horizontal recyclerview inside a fragment. Now when I click on any item I don\'t see the on click listener working. Here is my code for the Adapter class:
<

相关标签:
3条回答
  • 2020-12-19 07:15

    In ‘CustomViewHolder’ below ‘super(view)’ add view.setOnClickListener(this)

    You’re done Should work.

    0 讨论(0)
  • 2020-12-19 07:16

    1.Simple Click Handler within ViewHolder

    RecyclerView does not have special provisions for attaching click handlers to items unlike ListView which has the method setOnItemClickListener(). To achieve a similar effect, we can attach click events within the ViewHolder within our adapter:

    public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> {
        // ...
    
        // Used to cache the views within the item layout for fast access
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            public TextView tvName;
            public TextView tvHometown;
            private Context context;
    
            public ViewHolder(Context context, View itemView) {
                super(itemView);
                this.tvName = (TextView) itemView.findViewById(R.id.tvName);
                this.tvHometown = (TextView) itemView.findViewById(R.id.tvHometown);
                // Store the context
                this.context = context;
                // Attach a click listener to the entire row view
                itemView.setOnClickListener(this);
            }
    
            // Handles the row being being clicked
            @Override
            public void onClick(View view) {
                int position = getLayoutPosition(); // gets item position
                User user = users.get(position);
                // We can access the data within the views
                Toast.makeText(context, tvName.getText(), Toast.LENGTH_SHORT).show();
            }
        }
    
        // ...
    }
    

    Another way is my preferred way.. but this is also a fine way to go about it.

    My onBindViewHolder

    @Override
        public void onBindViewHolder(CategoryViewHolder holder, int position) {
            Category category = mCategories.get(position);
    
            holder.tvTitle.setText(category.getTitle());
            holder.tvDescription.setText(category.getDescription());
    
            holder.rlContainer.setOnClickListener(mClickListener);
            holder.rlContainer.setTag(holder);
        }
    

    My class level (Adapter object of View.OnClickListner)

    View.OnClickListener mClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CategoryViewHolder holder = (CategoryViewHolder) view.getTag();
                int position = holder.getAdapterPosition();
    
                startAppointmentBookingFor(mCategories.get(position));
            }
        };
    

    so basically attach the listener to any view in your holder (I try to put it on container only), then extract it out on the onclick and handle positions etc.

    0 讨论(0)
  • 2020-12-19 07:20

    Make the following changes to your Adapter:

    public class FeaturedProductsAdapter  extends RecyclerView.Adapter<FeaturedProductsAdapter.CustomViewHolder> {
    private List<FeaturedProductInfo> feedItemList;
    private Context mContext;
    private OnItemClickListener onItemClickListener;
    
    public FeaturedProductsAdapter(Context context, List<FeaturedProductInfo,OnItemClickListener onItemClickListener> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
        this.onItemClickListener = onItemClickListener;
    
    }
    public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        protected ImageView imageView;
        protected TextView textView,priceView;
        private Context context;
    
    
        public CustomViewHolder(View view,Context context) {
    
            super(view);
            this.context=context;
            this.imageView = (ImageView) view.findViewById(R.id.thumbnail);
            this.textView = (TextView) view.findViewById(R.id.prodTitle);
            this.priceView = (TextView) view.findViewById(R.id.prodPrice);
            view.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View view) {
    
            onItemClickListener.onItemClick(getLayoutPosition());
            Log.e("Check", position + "");
            FeaturedProductInfo user = feedItemList.get(position);//[position];
            // We can access the data within the views
            Intent intent = new Intent(context, ProductDescription.class);
            intent.putExtra("id", user.getId());
            mContext.startActivity(intent);
    
    
        }
    
    }
    
    public interface OnItemClickListener{
        void onItemClick(int position);
    }
    
    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.featured_product_list_item_card, null);
        Context context = viewGroup.getContext();
    
        CustomViewHolder viewHolder = new CustomViewHolder(view,context);
    
        return viewHolder;
    }
    
    @Override
    public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
        FeaturedProductInfo feedItem = feedItemList.get(i);
    
        //Download image using picasso library
        if(!feedItem.getUrl().contains("."))
        {
            feedItem.setUrl("nothing");
        }
        Picasso.with(mContext).load(feedItem.getUrl())
                .error(R.drawable.unavailable)
                .placeholder(R.drawable.unavailable)
                .resize(110,110)
                .into(customViewHolder.imageView);
    
        //Setting text view title
        customViewHolder.textView.setText(feedItem.getTitle());
        customViewHolder.priceView.setText(feedItem.getPrice());
        //Log.e("Featured: ","SET");
    }
    
    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
    
    0 讨论(0)
提交回复
热议问题