Android L 的 RecyclerView 面临的挑战

Posted

技术标签:

【中文标题】Android L 的 RecyclerView 面临的挑战【英文标题】:Challenges in RecyclerView of Android L 【发布时间】:2014-08-25 02:40:02 【问题描述】:

我和RecyclerView 玩了一会儿。有没有什么简单的方法可以将OnClickListener 用于RecyclerView 中的项目?我已经尝试在ViewHolder 中实现它。 onClick 事件从未被触发。

我使用notifyItemInserted(position)RecyclerView 添加新值。 UI 不会自动刷新。需要上下拉动才能刷新。但是当我调用notifyDatasetChanged(..)时,就可以了。

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

感谢您的任何想法。

这是我测试过的第一个 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();


【问题讨论】:

你可以试试gist.github.com/grantland/cd70814fe4ac369e3e92 这正是我上面所说的。那家伙正在从 ViewHolder 实现 OnClickListener。我尝试过这个。但是,onClick 事件从未被触发。 他的代码调用setOnClickListener()。上面显示的不是。 你是如何在 RecyclerView 中管理拉刷新的? 【参考方案1】:

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

@Override
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) 
    yourItems.setOnClickListener(new OnClickListener() 
       @Override
       public void onClick(View v) 
          //do your stuff
       
   );

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

https://github.com/davideas/FlexibleAdapter

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

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

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

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

【讨论】:

【参考方案4】:

Here 你得到一个简单的适配器类,它可以在recyclerview 的每个列表行上执行onItemClick 事件。

【讨论】:

以上是关于Android L 的 RecyclerView 面临的挑战的主要内容,如果未能解决你的问题,请参考以下文章

如何导入 RecyclerView for Android L-preview

为啥 CardView 和 RecyclerView 需要 minSdkVersion L?

关于Android RecyclerView的那些开源LayoutManager

全屏 RecyclerView 图像滑块

多个 RecyclerView 不在同一个片段中工作

解决RecyclerView&ListView滚动到顶部或者底部边界出现阴影问题