Android L的RecyclerView面临的挑战

时间:2014-07-03 20:24:57

标签: android android-5.0-lollipop android-recyclerview

我一直在玩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();
}
}

4 个答案:

答案 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

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

我认为,ViewHolder应该保持点击的听众,并且它应该在创建时而不是在Binding方法中完成(在来自notify ...()的每个invalidate中调用)。 / p>

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

我仍然需要改进它,所以要留意它。我还想添加一些新的功能,如撤销。