【发布时间】:2015-04-20 10:55:46
【问题描述】:
我正在加载一个类别列表,根据选择的类别,我需要在RecyclerView 中显示相应类别的产品。
因此,当我第一次启动 Fragment 时,我需要模拟用户点击默认类别 - 在这种情况下,它将是第一个。
我该怎么做?
【问题讨论】:
标签: android android-recyclerview
我正在加载一个类别列表,根据选择的类别,我需要在RecyclerView 中显示相应类别的产品。
因此,当我第一次启动 Fragment 时,我需要模拟用户点击默认类别 - 在这种情况下,它将是第一个。
我该怎么做?
【问题讨论】:
标签: android android-recyclerview
没有您的代码,我们不知道您如何实现 onClickListener。
通常,您在 RecyclerView.Adapter 的 viewHolder 中实现并设置项目 onClickListener。
例如:ViewHolder.itemView.setOnClickListener(listener);
所以解决方案是你可以使用recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()
PS:不要按照Doc使用findViewHolderForLayoutPosition()
【讨论】:
这是在设置适配器后选择RecyclerView 的第一个孩子的解决方法。
//position to be clicked
final int pos = 0;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
}
},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.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;
}
}
【讨论】:
如果你想点击某一行内的特定视图,那么使用
recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick();
【讨论】:
如果您已经从 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)
}
【讨论】:
下面的代码为你剪掉了,也避免了NullPointerException:
recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
recyclerView.findViewHolderForAdapterPosition(mPosition).itemView.performClick();
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
【讨论】: