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);
}
}
我有一个带有自定义 `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);
}
}