Java 从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中删除项目时,似乎没有更新某些内容。我想我有

我有包含文本视图和按钮的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中删除项目时,似乎没有更新某些内容。我想我有问题的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
的本地副本,以防止将来出现类似的错误。)