在RecyclerView中以编程方式单击项目

时间:2015-04-20 10:55:47

标签: android android-recyclerview

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

我该怎么做?

4 个答案:

答案 0 :(得分:21)

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

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

因此解决方案是您可以使用recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()

PS:请勿根据Doc

使用findViewHolderForLayoutPosition()

答案 1 :(得分:16)

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

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

答案 2 :(得分:6)

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

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

正如文档中所述:

  

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

    @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;

     }
  }

答案 3 :(得分:0)

如果要单击位置行内的特定视图,请使用

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