2012-08-17 67 views
5

我不明白什么是错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(); 
     } 

AND(最有趣的)

我得到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

我已经有一个帖子...但我解决不了这个问题

IndexOutOfBoundException when I use notifyDataSetChanged

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; 

    } 

我的基础活动,其中我打电话移除管路

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

} 

继续我试验,得出的结论是,在适配器列表中的字符串关系不大的事实,输出到屏幕上,这样的挑战是改变主题 。需要了解如何从屏幕上删除行

+0

可以为您的代码添加到您的问题在当你从表中选择一个对象返回该对象的索引? – 2012-08-17 08:50:53

+0

我添加了请看 – 2012-08-17 09:00:01

+0

'int position'是什么,这是所选UrlItem的索引吗? – 2012-08-17 09:00:59

回答

2

该解决方案很简单。

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

没有正常工作,重绘焦点名单已经改变和删除线混乱..苦恼了一个星期的决定很简单,留给修复