java - 清除全局 ArrayList 也会清除另一个

标签 java android arrays

我有一个非常奇怪的错误。

我正在编写一个泛型类,在它的一个方法中,有一件奇怪的事情。这里是类代码(不完整):

public abstract class GenericFragment<M extends BaseModel, A extends BaseAdapter> extends HtmlFragment {

    private ArrayList<M> datas = new ArrayList<>();    
    private A adapter;

    protected abstract String getUrl();

    protected abstract A setAdapter();

    protected A getAdapter() {

        if(adapter == null) {
             adapter = setAdapter();
        }

        return adapter;
    }

    protected ArrayList<M> getDatas() {
        return datas;
    }

    protected void refreshData(ArrayList<M> datas) {

        Log.d("before glob", String.valueOf(this.datas.size()));
        Log.d("before loc", String.valueOf(datas.size()));

        this.datas.clear();

        Log.d("clear glob", String.valueOf(this.datas.size()));
        Log.d("clear loc", String.valueOf(datas.size()));

        this.datas.addAll(datas);

        Log.d("after glob", String.valueOf(this.datas.size()));
        Log.d("after loc", String.valueOf(datas.size()));

        getAdapter().notifyDataSetChanged();
    }
}

当我调用函数 refreshData() 时,全局 ArrayList 被清除,本地 ArrayList 也被清除。这是日志:

D/niviel: before glob: 5
D/niviel: before loc: 5
D/niviel: clear glob: 0
D/niviel: clear loc: 0
D/niviel: after glob: 0
D/niviel: after loc: 0

我只想将本地数组克隆到全局数组。

编辑:

该函数在子类中被调用。

requestData(activity, new requestDataCallback() {
    @Override
    public ArrayList<? extends BaseModel> parseDatas(Document document) {
        return RecordProvider.getRecord(activity, document);
    }

    @Override
    public void runOnUIThread(ArrayList<? extends BaseModel> datas) {

        refreshData((ArrayList<Record>) datas);
    }

});

最佳答案

在您的 refreshData() 中,您使用的两个列表是相同的。

protected void refreshData(ArrayList<M> datas) {

Log.d("before glob", String.valueOf(this.datas.size()));
Log.d("before loc", String.valueOf(datas.size()));

//here you are clearing datas
this.datas.clear();

//so now your datas size will be 0

Log.d("clear glob", String.valueOf(this.datas.size()));
Log.d("clear loc", String.valueOf(datas.size()));

//here you are adding it to datas again whose size is already 0
this.datas.addAll(datas);

Log.d("after glob", String.valueOf(this.datas.size()));
Log.d("after loc", String.valueOf(datas.size()));

getAdapter().notifyDataSetChanged();
}

关于java - 清除全局 ArrayList 也会清除另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149990/

相关文章:

java - 为什么我会收到 ClassNotFoundException?

java - 我应该使用哪个布局管理器来实现以下目标?

Android - 在 EditText 中处理 "Enter"

ios - swift 3 : How to use for loop for looping arrays

java - 当我要求用户输入时,我无法从数组中删除元素

java - UnitTest - 测试方法总是返回空映射

java - 如何从 java 顺序执行 wsl 命令?

android - ndk-构建 "member ... in archive is not an object"

android - Camera Source (Google Mobile Vision) 在某些设备上返回旋转图像

ios - Objective C 如何合并多个 NSMutableArray?