【问题标题】:RecyclerView OnClick not workingRecyclerView OnClick 不工作
【发布时间】:2016-06-05 16:56:26
【问题描述】:

我在片段内制作了一个水平回收视图。现在,当我单击任何项​​目时,我看不到 on click 侦听器正在工作。这是我的适配器类代码:

public class FeaturedProductsAdapter  extends RecyclerView.Adapter<FeaturedProductsAdapter.CustomViewHolder> {
private List<FeaturedProductInfo> feedItemList;
private Context mContext;

public FeaturedProductsAdapter(Context context, List<FeaturedProductInfo> feedItemList) {
    this.feedItemList = feedItemList;
    this.mContext = context;
}
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) {

        int position = getLayoutPosition(); // gets item position
        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);


    }

}

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

}

我想我不知道如何正确使用视图支架。虽然我在其他活动中为 recyclerView 使用了相同的代码,但它的作用就像魅力一样。

【问题讨论】:

  • 是根本没有触发还是只是触发不正确。您应该在 bindViewHolder() 期间设置 onClick,因为您最初只创建一次视图持有者,然后在列表滚动时“回收”它。
  • @Helix 根本没有触发。
  • 视图的背景是否未设置?还要添加一个 toast 进行调试。

标签: android android-adapter android-recyclerview


【解决方案1】:

1.ViewHolder内的简单点击处理程序

RecyclerView 没有将点击处理程序附加到项目的特殊规定,这与 ListView 不同,ListView 具有方法 setOnItemClickListener()。为了达到类似的效果,我们可以在适配器内的ViewHolder 中附加点击事件:

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

    // ...
}

另一种方式是我的首选方式..但这也是一种很好的方式。

我的 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);
    }

我的班级级别(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));
        }
    };

所以基本上将侦听器附加到您持有人中的任何视图(我尝试仅将其放在容器上),然后将其提取到 onclick 并处理位置等。

【讨论】:

  • 嘿,我在上面使用了相同的方法,但它不起作用。
  • 这就是为什么我以另一种方式输入我喜欢的方式:),试试这个@AkshayBhasin
  • 这个 rlContainer 是什么?
  • 它基本上是viewHolder的容器......即:.....所以我只是附加了一个id,瞧,父级变成了我的容器用于我的适配器使用的视图,您现在可以将它附加到您的 priceView 或 TextView。
  • @AkshayBhasin 我很确定您一定忘记附加点击监听器。这是你一定错过的那一行:itemView.setOnClickListener(this);
【解决方案2】:

在“super(view)”下方的“CustomViewHolder”中添加 view.setOnClickListener(this)

你已经完成了 应该可以。

【讨论】:

    【解决方案3】:

    对您的适配器进行以下更改:

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

    【讨论】:

    • 不起作用。现在我什至看不到项目上的 onClick 效果。
    • 显示设置适配器的 MainActivity 的代码
    • 嘿,你为什么将 itemClickListener 传递给适配器?它给出了一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多