私のfire tvアプリでは、recyclerview
withを使用していhorizontal layout
ます。
dpad でのスクロールも機能し、アイテムがフォーカスされています。
Textview
しかし、ボタンを押したままにすると、多くのキーダウンイベントがトリガーされ、アイテムがフォーカスを失い、リサイクルビューの上にある別のアイテムがフォーカスを獲得しているため、スクロールできなくなるため、スクロールが非常に速くなります。
バグのようです。これに対する回避策はありますか?
私のfire tvアプリでは、recyclerview
withを使用していhorizontal layout
ます。
dpad でのスクロールも機能し、アイテムがフォーカスされています。
Textview
しかし、ボタンを押したままにすると、多くのキーダウンイベントがトリガーされ、アイテムがフォーカスを失い、リサイクルビューの上にある別のアイテムがフォーカスを獲得しているため、スクロールできなくなるため、スクロールが非常に速くなります。
バグのようです。これに対する回避策はありますか?
@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();
}
}
私は同じ問題に直面しています.私のプロジェクトで行っていることは、以下のアクティビティ(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 でフォーカスが正常に機能します。
notifyItemChanged(position) を使用してみてください 。それは私からの仕事です。アダプター内に呼び出しアダプターがあり、子アダプターには複数の編集テキストがあり、notifydatasetchange を呼び出すとフォーカスが失われます。だから私はnotifyItemChanged(Position)に置き換えます。
notifyItemChanged(position);