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?