我正在加载一个类别列表,根据选择的类别,我需要在RecyclerView
中显示相应类别的产品。
因此,当我第一次启动Fragment
时,我需要模拟用户点击默认类别 - 在这种情况下,它将是第一个。
我该怎么做?
答案 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();