kaleai / CommonAdapter

通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter
Apache License 2.0
905 stars 185 forks source link

如果仅仅有footview,在界面第一次添加数据时,会自动滚动到底部!! #24

Open kaleai opened 8 years ago

kaleai commented 8 years ago

复现路径: 初始化不设置数据,仅仅设置底部

异步加载网络,调用list的addAll方法添加数据

使用的是 ObservableArrayList

kaleai commented 7 years ago

dataBinding提供的ObservableArrayList的addAll方法最终会触发,adapter的

public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
           notifyItemRangeInserted(positionStart, itemCount);
           notifyItemRangeChanged(positionStart, itemCount);
}

属于在尾部插入了一堆数据,故我模拟了最正常的方式:

recyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                data.addAll(DataManager.loadData(getBaseContext(), 25));
                adapter.notifyItemRangeInserted(0, 25);

            }
        }, 1000);

发现结果还是会定位到底部的item,说明插入后recyclerView的机制就是会定位到插入的item处。

这个问题和有没有footer无关,可以自行测试。

如果有了header,这个问题确实就可以解决了具体原因未知,可能是header的出现,阻碍了其滚动到新插入item位置的动作。

如果要正常解决这个问题,可以采用下列的list,调用其reset方法即可。 https://github.com/tianzhijiexian/DBinding/blob/master/dbindinglib/src/main/java/kale/dbinding/util/ObservableArrayList.java

humanheima commented 6 months ago

应该跟这行代码有关系 adapter.notifyItemRangeInserted(0, 25); ,换成 adapter.notifyDataSetChanged 试一试?