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

时间:2017-04-06 21:42:10

标签: java android listview android-arrayadapter

我有一个带有自定义`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参数,或将其保存在另一个参数中也无济于事。

3 个答案:

答案 0 :(得分:1)

试试这个:

@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();
}

答案 1 :(得分:1)

您似乎正在使用构造函数设置ArrayList的相同实例来更新值。你可以通过不从外部设置初始值来超越这个。此外,您实际上并不需要班上的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

答案 2 :(得分:0)

问题是:如果我使用它更新了arrayadapter,我初始化为:

package com.amazonaws.lambda.demo;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<String, String> {

    @Override
    public String handleRequest(String input, Context context) // error is this hanleRequest it states Multiple markers at this line
    - The method handleRequest(String, Context) of type LambdaFunctionHandler must override a superclass method
    - implements   {
        context.getLogger().log("Input: " + input);

        // TODO: implement your handler
        return null;
    }

}


}

所以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); } 清除我的价值观。例如我使用值列表1初始化我的数组适配器,然后我更新值列表2,所以它更糟,但再次更新值列表1,它是空的。 我的工作模式是你的例子的混合,所以THX!

this.clear()