14

私のfire tvアプリでは、recyclerviewwithを使用していhorizontal layoutます。

dpad でのスクロールも機能し、アイテムがフォーカスされています。

Textviewしかし、ボタンを押したままにすると、多くのキーダウンイベントがトリガーされ、アイテムがフォーカスを失い、リサイクルビューの上にある別のアイテムがフォーカスを獲得しているため、スクロールできなくなるため、スクロールが非常に速くなります。

バグのようです。これに対する回避策はありますか?

4

6 に答える 6

8

@tmm1 による回答がこれまでで最高のものだと思います。ユーザーが DPAD を使用してスクロールする速度が速すぎると、RecyclerView に読み込まれた要素がフォーカスを失ってしまうという問題に対して、この回避策を実装することに成功しました。

私の RecyclerView のアダプターでは、LayoutInflater を使用して、このように要素ビューを膨らませます

@Override
public ListItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_keyboard_key, viewGroup, false);
    return new ListItemViewHolder(itemView);
}

私のitem_keyboard_key.xmlはもともとこのように定義されていました

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_keyboard_key_layout"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_keyboard_key_text"
        android:text="A"/>

</FrameLayout>

次に、FrameLayout を拡張し、これをルート レイアウトとして使用する新しいカスタム FrameLayout クラス (FocusFixFrameLayout) を作成しました。私のitem_keyboard_key.xmlはその後になりました

<?xml version="1.0" encoding="utf-8"?>
<no.bluebit.views.FocusFixFrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_keyboard_key_layout"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_keyboard_key_text"
        android:text="A"/>

</no.bluebit.views.FocusFixFrameLayout>

私のFocusFixFrameLayoutクラスは次のようになります

public class FocusFixFrameLayout extends FrameLayout {

    public FocusFixFrameLayout(@NonNull Context context) {
        super(context);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
}

    @Override
    public void clearFocus() {
        if(this.getParent() != null)
            super.clearFocus();
    }
}
于 2018-06-20T20:46:39.277 に答える
5

私は同じ問題に直面しています.私のプロジェクトで行っていることは、以下のアクティビティ(RecyclerViewを含む)で好きです:

    private long mLastKeyDownTime = 0;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        long current = System. currentTimeMillis();
        boolean res = false;
        if (current - mLastKeyDownTime < 300 ) {
            res = true;
        } else {
            res = super.onKeyDown(keyCode, event);
            mLastKeyDownTime = current;
        }
        return res;
    }

これにより、dpad のボタンを押したままにすると高速スクロールが回避され、RecyclerView でフォーカスが正常に機能します。

于 2016-03-05T02:21:32.727 に答える
0

notifyItemChanged(position) を使用してみてください 。それは私からの仕事です。アダプター内に呼び出しアダプターがあり、子アダプターには複数の編集テキストがあり、notifydatasetchange を呼び出すとフォーカスが失われます。だから私はnotifyItemChanged(Position)に置き換えます。

notifyItemChanged(position);
于 2021-07-19T09:21:01.157 に答える