我有一个带有GridLayoutManager的RecyclerView,每行2列。因为开发用于Android TV,所以我需要重点导航。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9nN1Fici5wbmcifQ==” alt =“在此处输入图像描述”>
如果我使用向下键导航到任何可见项目,那没关系。例如,项目1->项目3->项目5->项目7(仅部分可见)。但是当我再次按下键时,焦点将移至项目10而不是9。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9tSVluRi5wbmcifQ==” alt =“在此处输入图像描述”>
我的网格视图适配器是:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
private ArrayList<String> mDataset;
public GridAdapter(ArrayList<String> myDataset) {
mDataset = myDataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_item, viewGroup, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.txtTitle.setText(mDataset.get(position));
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView txtTitle;
public ViewHolder(View v) {
super(v);
txtTitle = (TextView) v.findViewById(R.id.title);
}
}
}
任何想法如何解决此问题?谢谢。
查看this related post和Vganin's answer以解决您的问题。
我已将此错误报告给AOSP问题跟踪器:issue 190526
正如我从源代码中看到的那样,问题是因为GridLayoutManager使用LinearLayoutManager的onFocusSearchFailed()的实现是当焦点接近RecyclerView的内部边界时调用。LinearLayoutManager的实现仅提供第一个/最后一个(取决于在滚动方向上)元素。因此,重点转移到第一/最后新行的元素。
我想出了一个答案。除非新行被夸大,否则它不会让您滚动(因此它将等待新行被夸大。),但是通常花费不到50到100毫秒。因此,我们同意该行为可以接受。
仅获得onFocusSearchFailed无法返回null。这是一个例子。
/**
* Created by sylversphere on 15-04-22.
*/
public class DelayedNaviGridLayoutManager extends GridLayoutManager{
private final Context context;
public SomeGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
this.context = context;
}
public SomeGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
this.context = context;
}
@Override
public View onFocusSearchFailed(View focused, int focusDirection, RecyclerView.Recycler recycler, RecyclerView.State state) {
return null;
}
}