9

行ごとに2列のGridLayoutManagerを備えたRecyclerViewがあります。開発は Android TV 用であるため、操作に集中する必要があります。

ここに画像の説明を入力

下キーを使用して表示されているアイテムに移動しても問題ありません。たとえば、アイテム 1 -> アイテム 3 -> アイテム 5 -> アイテム 7 (部分的にのみ表示されます)。しかし、もう一度下キーを押すと、フォーカスは項目 9 ではなく項目 10 に移動します。

ここに画像の説明を入力

私のグリッドビューアダプターは次のとおりです。

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);
        }
    }
}

この問題を解決する方法はありますか? ありがとう。

4

2 に答える 2

2

問題を解決するには、この関連投稿とVganinの回答を参照してください。

このバグを AOSP イシュー トラッカーに報告しました: issue 190526

ソースからわかるように、この問題は、フォーカスが RecyclerView の内側の境界に近づくと呼び出される onFocusSearchFailed() の LinearLayoutManager の実装を GridLayoutManager が使用するためです。LinearLayoutManager の実装は、最初/最後 (スクロール方向に依存) 要素のみを提供します。したがって、フォーカスは新しい行の最初/最後の要素にジャンプします。

この問題に対する私の回避策。

于 2016-02-03T10:33:50.243 に答える
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;
    }
}
于 2015-05-20T20:56:50.530 に答える