布局设计:
HorizontalScrollView-parent, holding RV[
RecyclerView=>(GridLayoutManager) (orientation verticle)]
基本上将进行双向滚动。此用户界面是为电视构建的。此网格中的焦点行将显示额外的细节,而其他行则不会。因此,只要在onFocusChange
中将焦点从一行更改为另一行,我都会修改dataset
的{{1}}并调用Adapter
。
当行的长度超过屏幕的垂直长度(即垂直滚动)时,此方法很好用。发生崩溃的原因是说行数较少(例如4)。
错误:
notifyItemRangeChanged()
我尝试调用notifydatasetchange,但是它将返回getAdapterPosition = -1,这不会导致焦点从第一行更改为另一行
由于适配器代码长度超过了stackoverflow设置的字符长度,因此我提供了相同的驱动器链接。 Adapter and viewholder layout code
答案 0 :(得分:1)
当recyclerview中的项目可聚焦时,我遇到了同样的问题。 尝试以下操作:
选项1
滚动视图中的用户windowSoftInputMode="adjustPan"
选项2 将自定义ScrollListener附加到Activity中,目的是当RV开始滚动时,清除当前焦点。
protected class FocusableScrollListner implements OnScrollListener {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// do nothing
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (SCROLL_STATE_TOUCH_SCROLL == scrollState) {
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
currentFocus.clearFocus();
}
}
}
}
选项3:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View currentFocus = ((Activity)context).getCurrentFocus();
if (currentFocus != null) {
currentFocus.clearFocus();
}
}
根据您的代码,可能还有其他选择,您必须清除焦点。