2016-02-23 90 views
3

我在一个片段中制作了水平回收站。现在,当我点击任何项目时,我看不到点击监听器正在工作。这里是我的适配器类代码:
RecyclerView OnClick不能正常工作

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相同的代码,但它的作用与魅力相似。

+0

它是不是在所有的射击或它只是正确的射击。您应该在bindViewHolder()期间设置onClick,因为您只在初始时创建视图保持器,然后在滚动列表时“回收”它。 – Helix

+0

@Helix它根本没有发射。 –

+0

未设置视图的背景吗?也为调试添加敬酒。 – Helix

回答

8

1.Simple内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(); 
     } 
    } 

    // ... 
} 

另一种方式是我的首选方法。但是这也是一个好方法去做。

我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的Adapter对象)

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和处理位置等

+0

嘿,我在那里使用了相同的方法,而且没有工作。 –

+0

这就是为什么我用另一种方式输入我最喜欢的方式:),试试这个@AkshayBhasin – yUdoDis

+0

这是什么rlContainer? –

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

不起作用。现在我甚至看不到物品上的onClick效果。 –

+0

显示您设置适配器的MainActivity的代码 –

+0

检查更新的答案 –