NotifyDataSetChanged () - IndexOutOfBoundException

I do not understand what is wrong.

I use

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

And (the most interesting)

I get numberToDelete = 1

Then this line is deleted

enter image description here

but objects enter image description here

and when numberToDelete = 0

Then this line is deleted

enter image description here

but objects enter image description here

And when numberToDelete = 2

objects

enter image description here

but after notifyDataSetChanged (); IndexOutOfBoundException

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

IndexOutOfBoundException when I use notifyDataSetChanged

stackoverflow.com/a/9260757/1568164 I feel like the situation is, I use, but not work

Then I get a position for further deletion

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 main Activity, in which I call the delete 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);
    }

}

continuation of the topic I experimented and came to the conclusion that the lines in the list of adapters have little in common with the fact that the output to the screen, so the problem changes. you need to understand how to remove lines from the screen

+5
1

.

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

, .. ,

+2

All Articles