【问题标题】:Clicking on item programmatically in RecyclerView在 RecyclerView 中以编程方式单击项目
【发布时间】:2015-04-20 10:55:46
【问题描述】:

我正在加载一个类别列表,根据选择的类别,我需要在RecyclerView 中显示相应类别的产品。 因此,当我第一次启动 Fragment 时,我需要模拟用户点击默认类别 - 在这种情况下,它将是第一个。

我该怎么做?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    没有您的代码,我们不知道您如何实现 onClickListener。

    通常,您在 RecyclerView.Adapter 的 viewHolder 中实现并设置项目 onClickListener。
    例如:ViewHolder.itemView.setOnClickListener(listener);

    所以解决方案是你可以使用recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()

    PS:不要按照Doc使用findViewHolderForLayoutPosition()

    【讨论】:

      【解决方案2】:

      这是在设置适配器后选择RecyclerView 的第一个孩子的解决方法。

      //position to be clicked
      final int pos = 0;
      new Handler().postDelayed(new Runnable() {
                          @Override
                          public void run() {
      recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
                          }
                      },1);
      

      【讨论】:

      • 为什么建议在这里使用handler?
      • 在点击事件上延迟 1 毫秒,因为它有时会给出空指针异常。
      • 请记住,您始终可以使用ViewTreeObserver.OnPreDrawListener 来避免 NPE 和不可靠的超时。像这样:recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { recyclerView.findViewHolderForAdapterPosition(lastPosition).itemView.performClick(); recyclerView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } });
      • 最好使用recyclerView.post(),因为它会在recyvlerView计算完后运行
      • @KERiii 最好使用您的选项
      【解决方案3】:

      纯粹主义者不赞成使用这种方法

          recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
      

      如文档中所述:

      返回数据集给定位置中项目的 ViewHolder。与 {@link #findViewHolderForLayoutPosition(int)} 不同,此方法考虑了可能尚未反映到布局的任何待处理的适配器更改。另一方面,如果调用了 {@link Adapter#notifyDataSetChanged()} 但尚未计算新布局,则此方法将返回 null,因为在计算布局之前,视图的新位置是未知的。 正是因为使用线程进行延迟有时很有用。任何对 notifyDataSetChanged() 的调用都会导致它返回 null。最好使用适配器方法 onBindViewHolder 并检查位置 0。调整您设置侦听器的方式,usual way 是此处的示例,在 ViewHolder 构造函数中创建。使用一个初始化变量来防止它被再次调用:

          @Override
          public void onBindViewHolder(FooAdapter.ViewHolder viewHolder, int position) {
           //code
           ...
           //do this last especially if you are using an animator
      
           if(position == 0 && isInit) {
              listener.onItemClick( viewHolder.itemView,0);
              isInit =false;
      
           }
        }
      

      【讨论】:

      • 非常感谢 :)
      • 你没有得到 OP 想要的东西。他们希望点击该项目而不是点击该项目
      【解决方案4】:

      如果你想点击某一行内的特定视图,那么使用

      recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick();
      

      【讨论】:

        【解决方案5】:

        如果您已经从 androidx.recyclerview.widget.ListAdapter 扩展 ListAdapter

        您可以简单地覆盖:

        override fun onCurrentListChanged(previousList: MutableList<DayMonth>, currentList: MutableList<DayMonth>) {
                super.onCurrentListChanged(previousList, currentList)
                this.presenter.onItemClickListener(currentList.size.minus(1))
                /**
                  Last postion   : size.minus(1)
                  First position : 0
                */
            }
        

        您的 Presenter 应该是这样的:

        interface Presenter {
                fun onItemClickListener(position : Int)
        }
        

        【讨论】:

          【解决方案6】:

          下面的代码为你剪掉了,也避免了NullPointerException

          recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
              @Override
              public boolean onPreDraw() {
                  recyclerView.findViewHolderForAdapterPosition(mPosition).itemView.performClick();
                  recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
                  return true;
              }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多