sNo*_*ore 5 android android-recyclerview linearlayoutmanager
在我的火电视应用我使用的是recyclerview
用horizontal layout
.
滚动与dpad工作和项目正在获得关注.
但是,当我按住按钮时,它会非常快速地滚动,因为许多keydown事件被触发,并且项目正在失去焦点而且不可能再滚动,因为Textview
我的recyclerview上方的另一个正在获得焦点.
它看起来像一个bug.这有什么解决方法吗?
我认为@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);
}
Run Code Online (Sandbox Code Playgroud)
我的 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>
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个新的自定义 FrameLayout 类 (FocusFixFrameLayout) 扩展 FrameLayout 并将其用作我的根布局。我的 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>
Run Code Online (Sandbox Code Playgroud)
我的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我面临同样的问题,我在我的项目中所做的事情在我的活动(包含 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;
}
Run Code Online (Sandbox Code Playgroud)
这避免了当您按住 dpad 上的按钮时快速滚动,并且焦点在我的 RecyclerView 中工作正常。
看起来这是一个错误。
请参阅/sf/answers/2323345951/和https://issuetracker.google.com/issues/37067220
我可以通过对clearFocus()
项目视图进行绝育来解决此错误,因此失去焦点的分离视图不会将焦点移出 RecyclerView:
override fun clearFocus() {
if (parent != null)
super.clearFocus()
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3932 次 |
最近记录: |