Java android ArrayAdapter.clear()清除自定义方法变量
我有一个带有自定义“ArrayAdapter”的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
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。