RecyclerView OnClick无法正常工作

时间:2016-02-23 17:46:13

标签: android android-adapter android-recyclerview

我在片段中制作了水平回收视图。现在,当我点击任何项目时,我没有看到点击监听器工作。这是我的Adapter类的代码:

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相同的代码,但它的功能却像魅力一样。

3 个答案:

答案 0 :(得分:13)

1.在ViewHolder

中单击“处理程序”

RecyclerView没有将点击处理程序附加到与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(); } } // ... } 内附加点击事件:

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

另一种方式是我喜欢的方式......但这也是一个很好的方法。

我的onBindViewHolder

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

我的班级(View.OnClickListner的适配器对象)

onclick

所以基本上将监听器连接到持有者的任何视图(我尝试将其放在容器上),然后在{{1}}上提取并处理位置等。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在“超级(视图)”下方的“ CustomViewHolder”中添加 view.setOnClickListener(this)

您完成了 应该可以。