我一直在玩RecyclerView
一点点。有没有简单的方法可以将OnClickListener
放入RecyclerView
中的项目?我试过在ViewHolder
中实现它。 onClick事件永远不会被触发。
我使用notifyItemInserted(position)
将新值添加到RecyclerView
。 UI未自动刷新。需要上下拉动才能刷新。但是当我调用notifyDatasetChanged(..)
时,它没问题。
我已将DefaultItemAnimator
应用于RecyclerView
。 但是,添加新项目时看不到任何动画。
感谢任何想法。
这是我测试过的第一个Android L组件,我正在那里。
这是我的Adapter类:
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder> {
private List<String> arrExperiences;
//Provide a reference to the type of views that you are using - Custom ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tvExperienceTitle;
public TextView tvExperienceDesc;
public MyViewHolder(RelativeLayout itemView) {
super(itemView);
tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title);
tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc);
}
}
//Provide a suitable constructor : depending on the kind of dataset.
public AdapterRecyclerView(List<String> arrExperiences){
this.arrExperiences = arrExperiences;
}
//Create new view : invoke by a Layout Manager
@Override
public AdapterRecyclerView.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_recycler, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
//get element from your dataset at this position.
//replace the content of the view with this element.
viewHolder.tvExperienceTitle.setText(arrExperiences.get(position));
}
@Override
public int getItemCount() {
return arrExperiences.size();
}
public void addExperience(String experience, int position){
arrExperiences.add(position, experience);
notifyItemInserted(position);
//notifyDataSetChanged();
}
public void removeExperience(){
int index = (int) (Math.random() * arrExperiences.size());
arrExperiences.remove(index);
notifyItemRemoved(index);
//notifyDataSetChanged();
}
}
答案 0 :(得分:2)
只需在适配器中添加:
@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
yourItems.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do your stuff
}
});
}
答案 1 :(得分:0)
请参阅我的回答here。您确实需要一个额外的类(可以作为完整版本的一部分包含在内),但它允许您按照用于ListView的方式创建OnItemClickListeners。
答案 2 :(得分:0)
Here你得到一个简单的Adapter类,它可以在onItemClick
的每个列表行上执行recyclerview
事件。
答案 3 :(得分:0)
既然你仍然没有给任何答案标记正确,即使这是一个老问题,我也会尝试提供我的方式。我认为它非常干净和专业。这些功能来自不同的博客(我仍然必须在页面中提及它们),合并并且方法已经针对使用RecycleView的所有活动的速度和可伸缩性进行了改进。
https://github.com/davideas/FlexibleAdapter
我认为,ViewHolder应该保持点击的听众,并且它应该在创建时而不是在Binding方法中完成(在来自notify ...()的每个invalidate中调用)。 / p>
另请注意此适配器处理基本点击:单击和长按,如果您需要双击,则需要在答案中使用Jabob Tabak does的方式。
我仍然需要改进它,所以要留意它。我还想添加一些新的功能,如撤销。