notifyDataSetChanged() - IndexOutOfBoundException

5
我不明白出了什么问题。 我正在使用。
  public class UrlArrayAdapter extends BaseAdapter {...      
         ArrayList<UrlItem> objects;

        UrlArrayAdapter(Context context, ListView urlListView,
                ArrayList<UrlItem> urlLists) {
objects = urlLists; ...



    //method
    public void deleteItem(int numberToDelete) {        
            objects.remove(numberToDelete);      
             notifyDataSetChanged();
        }

并且(最有趣的)

我得到numberToDelete = 1

然后删除此行

enter image description here

但是对象 enter image description here

并且当numberToDelete = 0时

然后删除此行

enter image description here

但是对象 enter image description here

并且当numberToDelete = 2时

对象

enter image description here

但是在notifyDataSetChanged();之后出现IndexOutOfBoundException异常

我已经发布了一个post...但我无法解决这个问题

当我使用notifyDataSetChanged时,IndexOutOfBoundException异常

stackoverflow.com/a/9260757/1568164 我感觉情况是这样,我使用了但是不起作用

然后我获取一个位置以进一步删除

public View getView(int position, View convertView, ViewGroup parent) {

        // Planet to display
        UrlItem urlItem = (UrlItem) this.getItem(position);
        ViewHolder viewHolder = null;

        if (convertView == null) {

            convertView = lInflater.inflate(R.layout.database_table_item, null);
            viewHolder = new ViewHolder();
            viewHolder.checkbox = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);

            viewHolder.checkbox.setOnCheckedChangeListener(listener1);

            viewHolder.text = (EditText) convertView
                    .findViewById(R.id.editText1);


            viewHolder.text
                    .setOnFocusChangeListener(new OnFocusChangeListener() {
                        public void onFocusChange(View v, boolean hasFocus) {
                            int getPosition = (Integer) v.getTag();
                            if (!hasFocus) {

                                final EditText Caption = (EditText) v;
                                // urlLists
                                objects.get(getPosition).setUrl(
                                        Caption.getText().toString());
                            } else {

                                DatabaseTable.setPosition(getPosition); // This is a future for "numberToDelete"
                            }
                        }
                    });

            convertView.setTag(viewHolder);
            convertView.setTag(R.id.checkBox1, viewHolder.checkbox);
            convertView.setTag(R.id.editText1, viewHolder.text);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();

        }
        viewHolder.text.setTag(position);
        viewHolder.text.setText(urlItem.getUrl());
        viewHolder.checkbox.setTag(position);
        viewHolder.checkbox.setChecked(urlItem.getUse());

        return convertView;

    }

我基于的Activity中调用了移除线的方法。

public class DatabaseTable extends Activity {
    private Settings setting;
    private ArrayList<UrlItem> urlLists;
    private ListAdapter uAdapter;
    private ListView urlListView;
    static int position;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.database_table_list);
        LBD conection = new LBD(this);
        conection.open();
        setting = conection.tblSettings();
        setting.create();
        urlLists = setting.selectRssTable();
        urlListView = (ListView) findViewById(R.id.listView1);
        uAdapter = new UrlArrayAdapter(DatabaseTable.this, urlListView,
                urlLists);
        urlListView.setAdapter(uAdapter);
        urlListView.setItemsCanFocus(true);
}
    public static void setPosition(int pos) {
        position = pos;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, 2, 2, "Delete URL");
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case 2:
        ((UrlArrayAdapter) uAdapter).deleteItem(position); 
break;

        }
        return super.onOptionsItemSelected(item);
    }

}

继续这个主题,我进行了实验并得出结论,适配器列表中的字符串与屏幕输出的事实关系很小,因此挑战在于改变。需要了解如何从屏幕中删除行。


你能否在你的问题中添加代码,使得当你从表格中选择一个对象时,返回该对象的索引? - Hip Hip Array
只是出于好奇,当您选择URL_3时,位置设置为什么索引? - Hip Hip Array
当然,在图片上也可以看到。 - Max Usanin
想象一下有一个类和两个方法 - 我展示了它们。但在notifyDataSetChanged()中,BaseAdapter中发生的事情仅有部分被描述[链接]stackoverflow.com/a/9260757/1568164 - Max Usanin
在你的 optionItemSelected() 中,你尝试过 urlLists.remove(position); uAdapter.notifyDataSetChanged(); 吗??从 BaseAdapter 类中删除 deleteItem(int numberToDelete) - user370305
显示剩余2条评论
1个回答

2
解决方案很简单。
viewHolder.text
                    .setOnFocusChangeListener(new OnFocusChangeListener() {
                        public void onFocusChange(View v, boolean hasFocus) {

如果功能无法正常工作,重新绘制焦点列表时会发生变化并删除混乱的行。经过一周的煎熬,决定很简单,放弃修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接