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

Java android ArrayAdapter.clear()清除自定义方法变量,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,我有一个带有自定义“ArrayAdapter”的ListView,其中我有时更新值。 一切正常,但在第一次更新时它变为空 我的阵列适配器: protected class ResultArrayAdapter extends ArrayAdapter<JsonObject> { private ArrayList<JsonObject> values; protected ResultArrayAdapter(ArrayList<JsonObject

我有一个带有自定义“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();
    }
}
受保护的类ResultaryAdapter扩展了ArrayAdapter{
私有数组列表值;
受保护的ResultArrayAdapter(ArrayList值){
super(上下文、R.layout.content\u result\u项、值);
这个值=值;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父级){…}
公共void updateValue(ArrayList值){
//这里的值为.size()>0,一切正常
这个.clear();
//这里的值为.size()==0,为什么??
for(JsonObject值:值){
增加(价值);
}
this.notifyDataSetChanged();
}
}
当我更新我的值时,我调用
updateValues()
,在调用
this.clear()
之后,这个方法的参数
ArrayList values
也是空的。因此,在此之后,没有任何值可添加到
this.add(value)
,而只能在第一次
onUpdate()之后添加


重命名
ArrayList value
参数或将其保存在另一个参数中也没有帮助。

请尝试以下操作:

@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();
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父级){…}
public void updateValue(ArrayList newValues){
//这里的值为.size()>0,一切正常
value.clear();
//这里的值为.size()==0,为什么??
for(JsonObject值:newValues){
增加(价值);
}
this.notifyDataSetChanged();
}

看起来您正在使用构造函数设置的
ArrayList
的相同实例更新值。您可以通过不从外部设置初始值来超越此限制。此外,您实际上不需要类中的
成员

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();
    }
}
受保护的类ResultaryAdapter扩展了ArrayAdapter{
受保护的ResultArrayAdapter(列表值){
super(context,R.layout.content_result_item,new ArrayList());
更新值(值);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父级){…}
公共void updateValue(列表值){
这个.clear();
此.addAll(值);
this.notifyDataSetChanged();
}
}

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

问题是:如果我用它的值更新了arrayadapter,我会初始化如下:

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()
清除我的值。e、 我用值列表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);
    }
}
受保护的类ResultaryAdapter扩展了ArrayAdapter{
私有数组列表值;
受保护的ResultArrayAdapter(上下文、ArrayList值){
super(context,R.layout.content_result_item,new ArrayList());//传递新的假值
this.values=values;//如果没有它,它将崩溃
更新值(值);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父级){…}
公共void updateValue(列表值){
这个.clear();
此.addAll(值);
}
}

因为ArrayAdapter存储通过构造函数传递的ArrayList引用,而clear方法在其上执行clear操作(不一定要小心筛选!!!)。。。另外,在add之后也不需要通知适配器,因为它是在add方法中完成的。只需使用addAll方法更新值,我认为“清除此项”是不正确的,您应该清除ArrayList。