【问题标题】:Challenges in RecyclerView of Android LAndroid L 的 RecyclerView 面临的挑战
【发布时间】: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();
}
}

【问题讨论】:

  • 这正是我上面所说的。那家伙正在从 ViewHolder 实现 OnClickListener。我尝试过这个。但是,onClick 事件从未被触发。
  • 他的代码调用setOnClickListener()。上面显示的不是。
  • 你是如何在 RecyclerView 中管理拉刷新的?

标签: android android-5.0-lollipop android-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 事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多