notifyItemRangeChanged()导致崩溃的RecyclerView Android

时间:2018-10-04 21:49:40

标签: android android-recyclerview recycler-adapter horizontalscrollview gridlayoutmanager

布局设计:

HorizontalScrollView-parent, holding RV[
    RecyclerView=>(GridLayoutManager) (orientation verticle)]

基本上将进行双向滚动。此用户界面是为电视构建的。此网格中的焦点行将显示额外的细节,而其他行则不会。因此,只要在onFocusChange中将焦点从一行更改为另一行,我都会修改dataset的{​​{1}}并调用Adapter

当行的长度超过屏幕的垂直长度(即垂直滚动)时,此方法很好用。发生崩溃的原因是说行数较少(例如4)。

错误:

notifyItemRangeChanged()

我尝试调用notifydatasetchange,但是它将返回getAdapterPosition = -1,这不会导致焦点从第一行更改为另一行

由于适配器代码长度超过了stackoverflow设置的字符长度,因此我提供了相同的驱动器链接。 Adapter and viewholder layout code

垂直滚动不会崩溃 Items without crash

垂直滚动崩溃 Items with crash

1 个答案:

答案 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();
    }
}

根据您的代码,可能还有其他选择,您必须清除焦点。