奇怪的Android RecyclerView(GridLayoutManager)焦点行为

Bag*_*yer 7 android android-tv recycler-adapter

我有一个带有GridLayoutManager的RecyclerView,每行有2列.因为开发适用于Android TV,所以我需要专注于导航.

在此输入图像描述

如果我使用向下键导航到任何可见项目,这没关系.例如,项目1 - >项目3 - >项目5 - >项目7(仅部分可见.).但是当我再次按下键时,焦点将转移到第10项而不是9.

在此输入图像描述

我的网格视图适配器是:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不知道如何解决这个问题?谢谢.

Dre*_*ale 0

我想出了一个黑客答案。除非新行被填充,否则它不会让您滚动(因此它将等待新行被填充。)但通常需要不到 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;
    }
}
Run Code Online (Sandbox Code Playgroud)