Android L的RecyclerView中的挑战

我一直在玩RecyclerView一点点。 有没有简单的方法把OnClickListener的项目在RecyclerView ? 我曾尝试在ViewHolder实现它。 onClick事件从来没有被触发。

我已经使用notifyItemInserted(position)RecyclerView添加新的值。 用户界面不会自动刷新。 需要上下刷新。 但是,当我调用notifyDatasetChanged(..) ,没关系。

我已经将DefaultItemAnimator应用于RecyclerView但是,添加新项目时没有看到任何animation。

感谢提前任何想法。

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

Solutions Collecting From Web of "Android L的RecyclerView中的挑战"

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

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

希望你能接受这个答案。

请在这里看到我的答案。 你确实需要一个额外的类(可能作为完整版本的一部分),但它可以让你创buildOnItemClickListeners的方式,你已经习惯了ListViews。

既然你还没有给出正确的答案,即使这是一个老问题,我也会尽力提供我的方式。 我认为这是非常干净和专业。 function是从不同的博客(我仍然不得不在页面中提到),合并和方法已经提高了速度和可扩展性,所有使用RecycleView的活动。

https://github.com/davideas/FlexibleAdapter

  • 在较低的类中有SelectableAdapter,它提供了selectfunction,并且可以在旋转之后保持状态,您只需要从活动调用onSave / onRestore方法。
  • 然后,类FlexibleAdapter在animation的支持下处理内容(仅为位置调用通知)。 注意:创build动作时,您仍然需要将animation设置为RecyclerView。
  • 那么你需要再次延伸这个类。 在这里,您可以根据自己的ViewHolder和您的Domain / Model类(数据持有者)添加和实现方法。 注意:我提供了一个不编译的例子,因为您需要使用项目中的类进行更改。

我认为,ViewHolder应该保持点击的监听器,并且应该在创build时完成,而不是在Binding方法中完成(从notify …()中的每个invalidate都被调用)。

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

我仍然需要改进,所以请留意一下。 我也想添加一些新的function,如撤消。

在这里你可以得到一个简单的Adapter类,它可以在每个列表行上执行onItemClick事件。