Jude95 / EasyRecyclerView

ArrayAdapter,pull to refresh,auto load more,Header/Footer,EmptyView,ProgressView,ErrorView
2.03k stars 459 forks source link

为什么RecyclerArrayAdapter初始化数据的时候重新new了一个List #192

Closed qiaoyj closed 7 years ago

qiaoyj commented 7 years ago

RecyclerArrayAdapter.java

V4.2.6

private void init(Context context , List<T> objects) {
    mContext = context;
    mObjects = objects;
}

V4.3.0

private void init(Context context , List<T> objects) {
    mContext = context;
    mObjects = new ArrayList<>(objects);
}

为什么要这么改?在数据增删的时候维护起来很麻烦。既要维护Adapter中的数据,又要维护activity中的数据。 当前我用的版本是4.2.3,升到最新版本4.4.0发现了这个问题。当在Activity中在数据集合中添加了元素,再调用adapter.notifyItemInserted刷新报了错,因为adapter中的数据集合与activity中的已经不是同一个引用了。

lumina0o0 commented 7 years ago

activity中使用list的时候,直接adapter.getAllData(),不需要手动管理

qiaoyj commented 7 years ago

当前用ItemTouchHelper对recyclerView拖动排序的时候,如何交换adapter内数据集合的顺序?

private class TestCallback extends  ItemTouchHelper.Callback{

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return 0;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        RecyclerArrayAdapter adapter = (RecyclerArrayAdapter) recyclerView.getAdapter();
        //adapter.getAllData(),这样是无法交换数据的
        Collections.swap(adapter.getAllData(), viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

    }
}
Jude95 commented 7 years ago

确实是缺陷。 V4.2.6以前是疏漏了。我从很早的版本开始就没想让开发者可以直接操作数据。我需要知道用户对数据做了哪些操作,很多操作我要做相应动作来保证库功能,直接改了就没办法了。 懂原理的也许可以拿着源数据做些更多功能且没有问题。 但好多人来向我报bug,就是他们不懂原理还瞎改源数据。。人太多我就封了这些个暴露源数据的API。

另外我也并不是封死了。。你们不觉得RecyclerArrayAdapter的所有成员属性...都是protected的吗...在你们子Adapter内部,你想改啥改啥...

嗯.我觉得会发现这些东西的人,一定可以完美拓展功能不出bug。

qiaoyj commented 7 years ago

谢谢,我明白怎么做了。