android ArrayAdapter.clear() 清除自定义方法变量

android ArrayAdapter.clear() clears custom method variable

我有一个带有自定义 `ArrayAdapter 的 ListView,我有时会在其中更新值。 一切正常,但在第一次更新时它变空了。

我的阵列适配器:

protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> {
    private ArrayList<JsonObject> values;
    protected ResultArrayAdapter(ArrayList<JsonObject> values) {
            super(context, R.layout.content_result_item, values);
            this.values = values;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { ... }
    public void updateValues(ArrayList<JsonObject> values) {
        //here values.size() > 0 and everything OK
        this.clear();
        //here values.size() == 0, why??
        for (JsonObject value : values) {
            this.add(value);
        }
        this.notifyDataSetChanged();
    }
}

当我更新我的值时,我调用 updateValues() 并且在调用 this.clear() 之后,此方法的参数 ArrayList<JsonObject> values 也是空的。所以在此之后,没有价值可以用 this.add(value) 添加,但只有在 onUpdate().

的第一次之后

重命名 ArrayList<JsonObject> values 参数或将其保存在另一个参数中也无济于事。

试试这个:

@Override
public View getView(int position, View convertView, ViewGroup parent) { ... }
public void updateValues(ArrayList<JsonObject> newValues) {
    //here values.size() > 0 and everything OK
    values.clear();

    //here values.size() == 0, why??
    for (JsonObject value : newValues) {
        values.add(value );
    }

    this.notifyDataSetChanged();
}

您似乎正在使用构造函数设置的 ArrayList 的同一实例更新值。您可以通过不从外部设置初始值来超越这一点。此外,您实际上并不需要 class.

中的 values 成员
protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> {
    protected ResultArrayAdapter(List<JsonObject> values) {
        super(context, R.layout.content_result_item, new ArrayList<JsonObject>());
        updateValues(values);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { ... }
    public void updateValues(List<JsonObject> values) {
        this.clear();
        this.addAll(values);
        this.notifyDataSetChanged();
    }
}

您还可以在 for 循环中使用 addAll() 而不是 add(),并提供 List 而不是 ArrayList。如果你愿意,你甚至可以选择Collection

问题是:如果我用我初始化的值更新数组适配器:

ListView resultsView = (ListView)findViewById(R.id.results);
ResultArrayAdapter adapter = (ResultArrayAdapter)resultsView .getAdapter();
if(adapter == null){
    adapter = new ResultArrayAdapter(MyActivity.this, values);
    resultsView .setAdapter(adapter);
} else {
    adapter.updateValues(values);
}

所以this.clear()清除了我的价值观。例如我用值列表 1 初始化我的数组适配器,然后我用值列表 2 更新,所以它很糟糕,但是再次用值列表 1 更新,它是空的。 我的解决方案是您的示例的混合,所以谢谢!

protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> {
    private ArrayList<JsonObject> values;
    protected ResultArrayAdapter(Context context, ArrayList<JsonObject> values) {
        super(context, R.layout.content_result_item, new ArrayList<JsonObject>()); //passing new fake values
        this.values = values; //without this, it crashes
        updateValues(values);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { ... }
    public void updateValues(List<JsonObject> values) {
        this.clear();
        this.addAll(values);
    }
}