12

我已经玩RecyclerView了一会儿。有什么简单的方法可以放入OnClickListener物品RecyclerView吗?我已经尝试在ViewHolder. onClick 事件从未被触发。

而且我已经习惯于notifyItemInserted(position)将新价值添加到RecyclerView. UI 不会自动刷新。需要上下拉动才能刷新。但是当我调用时notifyDatasetChanged(..),没关系。

我已经申请DefaultItemAnimatorRecyclerView但是,添加新项目时看不到任何动画。

提前感谢您的任何想法。

这是我测试过的第一个 Android L 组件,我一直卡在那里。

这是我的适配器类:

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

4 回答 4

2

只需将其添加到您的适配器中:

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) {
    yourItems.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
          //do your stuff
       }
   });
}
于 2016-05-23T21:28:33.313 回答
0

在此处查看我的答案。您确实需要一个额外的类(它可能包含在完整版本中),但它允许您以您习惯于 ListViews 的方式创建 OnItemClickListeners。

于 2014-10-04T20:26:57.810 回答
0

这里你得到一个简单的适配器类,它可以onItemClick在每个列表行上为recyclerview.

于 2014-12-04T04:12:51.167 回答
0

由于您仍然没有将任何答案标记为正确,即使这是一个老问题,我也会尝试提供我的方式。我认为它非常干净和专业。这些功能取自不同的博客(我仍然必须在页面中提及它们),合并并且方法已针对使用 RecycleView 的所有活动的速度和可扩展性进行了改进。

https://github.com/davideas/FlexibleAdapter

  • 在较低的类中,有提供选择功能的 SelectableAdapter,它能够在旋转后保持状态,您只需要从活动中调用 onSave/onRestore 方法。
  • 然后FlexibleAdapter类在动画的支持下处理内容(只为位置调用notify。注意:您仍然需要在创建活动时将动画设置为RecyclerView)。
  • 然后你需要再次扩展这个类。在这里,您可以根据需要为自己的 ViewHolder 和 Domain/Model 类(数据持有者)添加和实现方法。注意:我提供了一个无法编译的示例,因为您需要使用项目中的类更改类。

我认为,应该是 ViewHolder 应该保留点击的侦听器,并且它应该在创建时完成,而不是在 Binding 方法中(在每次从 notify...() 无效时调用)。

另请注意,此适配器处理基本点击:单击和长按,如果您需要双击,则需要使用Jabob Tabak在其回答中所做的方式。

我仍然需要改进它,所以请密切关注它。我还想添加一些新功能,例如撤消。

于 2015-05-04T08:59:41.927 回答