Java 从listview中删除项目
我有包含文本视图和按钮的listview。当我删除listview项目并尝试向下滚动时,我发现以下异常:Java 从listview中删除项目,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,我有包含文本视图和按钮的listview。当我删除listview项目并尝试向下滚动时,我发现以下异常: BuildQueue eile = countryList.get(position); 例外情况: 02-08 19:11:04.279: E/AndroidRuntime(10509): java.lang.IndexOutOfBoundsException: Invalid index 15, size is 15 当我从listview中删除项目时,似乎没有更新某些内容。我想我有
BuildQueue eile = countryList.get(position);
例外情况:
02-08 19:11:04.279: E/AndroidRuntime(10509): java.lang.IndexOutOfBoundsException: Invalid index 15, size is 15
当我从listview中删除项目时,似乎没有更新某些内容。我想我有问题的ViewHolder,但我不知道什么样的
我的ArrayAdapter代码:
public class MyCustomAdapter extends ArrayAdapter<BuildQueue> {
private ArrayList<BuildQueue> countryList;
public MyCustomAdapter(Context context, int textViewResourceId,ArrayList<BuildQueue> countryList) {
super(context, textViewResourceId, countryList);
this.countryList = new ArrayList<BuildQueue>();
this.countryList.addAll(countryList);
}
private class ViewHolder {
TextView code;
TextView field;
Button del;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.queue_buildings, null);
holder = new ViewHolder();
holder.code = (TextView) convertView.findViewById(R.id.code);
holder.field = (TextView) convertView.findViewById(R.id.field_text);
holder.del = (Button) convertView.findViewById(R.id.del_button);
convertView.setTag(holder);
holder.del.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Button del_button = (Button) v;
BuildQueue building = (BuildQueue) del_button.getTag();
countryList.remove(building);
dataAdapter.notifyDataSetChanged();
}
});
} else {
holder = (ViewHolder) convertView.getTag();
}
BuildQueue eile = countryList.get(position);
holder.code.setText(" ( Level: " + eile.getOld_level() + " to "+eile.getNew_level()+")");
holder.field.setText(eile.getNameSort());
holder.field.setTag(eile);
holder.del.setText("Delete");
holder.del.setTag(eile);
return convertView;
}
}
公共类MyCustomAdapter扩展了ArrayAdapter{
私有ArrayList国家列表;
公共MyCustomAdapter(上下文上下文,int textViewResourceId,ArrayList countryList){
super(上下文、textViewResourceId、countryList);
this.countryList=新的ArrayList();
this.countryList.addAll(countryList);
}
私有类视窗持有者{
文本视图代码;
文本视图字段;
按钮del;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
LayoutInflater vi=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
convertView=vi.充气(R.布局.队列建筑,空);
holder=新的ViewHolder();
holder.code=(TextView)convertView.findViewById(R.id.code);
holder.field=(TextView)convertView.findViewById(R.id.field\u text);
holder.del=(按钮)convertView.findViewById(R.id.del_按钮);
convertView.setTag(支架);
holder.del.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
按钮delu按钮=(按钮)v;
BuildQueue building=(BuildQueue)del_button.getTag();
国家名单。移除(建筑物);
dataAdapter.notifyDataSetChanged();
}
});
}否则{
holder=(ViewHolder)convertView.getTag();
}
BuildQueue eile=countryList.get(位置);
holder.code.setText(“(级别:+eile.getOld_-Level()+”到“+eile.getNew_-Level()+”);
holder.field.setText(eile.getNameSort());
holder.field.setTag(eile);
holder.del.setText(“删除”);
固定标签(eile);
返回视图;
}
}
您正在适配器中使用两个阵列,但只更改其中一个
每个适配器都使用getCount()
来确定应该绘制多少行。ArrayAdapter只是询问您在此处传递给超级构造函数的数组的大小:super(context,textViewResourceId,countryList)代码>。但是您也在使用第二个本地数组,当您从这个countryList
getCount()
中删除一个值时,您不知道发生了这种情况,这导致getView()
抛出一个IndexOutOfBoundsException
扩展BaseAdapter,或使用ArrayAdapter的方法,如、和,然后删除本地数据集。您使用的是notifyDataSetChanged()
?是的,dataAdapter.notifyDataSetChanged();我添加了:dataAdapter.remove(building);现在它工作了,谢谢:)很高兴我能帮忙。(如果您还没有这样做,我强烈建议您删除countryList
的本地副本,以防止将来出现类似的错误。)