notifyDataSetChanged() - IndexOutOfBoundException [英] notifyDataSetChanged() - IndexOutOfBoundException

查看:165
本文介绍了notifyDataSetChanged() - IndexOutOfBoundException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白什么是错

我用

  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

I get numberToDelete = 1

这行,然后删除

但对象

but objects

和当numberToDelete = 0

and when numberToDelete = 0

这行,然后删除

但对象

but objects

和当numberToDelete = 2

AND when numberToDelete = 2

对象

但是经过notifyDataSetChanged(); IndexOutOfBoundException

我已经有一个职位......但我解决不了这个问题。

I already have a post ... but I can not solve this problem

<一个href="http://stackoverflow.com/questions/11990399/indexoutofboundexception-when-i-use-notifydatasetchanged">IndexOutOfBoundException当我使用notifyDataSetChanged

stackoverflow.com/a/9260757/1568164我觉得情况是这样的,我使用,但无法正常工作

stackoverflow.com/a/9260757/1568164 I am feeling that the situation is this, i use but not work

然后我得到的位置,进一步去除

Then I get a position to further remove

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;

    }

我的基础上的活动,我呼吁清除行

My basis Activity where I call the removal line

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);
    }

}

继续主题 我试验并得出结论,在适配器列表中的字符串没有什么可以做的事实,输出到屏幕上,因此面临的挑战是不断变化的。需要了解如何从屏幕中删除行

continuing the theme I experimented and concluded that the strings in the list of adapters have little to do with the fact that the output to the screen, so the challenge is changing. need to understand how to delete rows from the screen

推荐答案

解决方案很简单。

viewHolder.text
                    .setOnFocusChangeListener(new OnFocusChangeListener() {
                        public void onFocusChange(View v, boolean hasFocus) {

没有正常工作,重画重点的名单已发生变化,删除线混乱..苦恼了一个星期的决定很简单,留给修复

did not work properly, redraw the list of focus has changed and deleted lines chaotic .. agonized for a week a decision was simple, left to fix

这篇关于notifyDataSetChanged() - IndexOutOfBoundException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆