2012-08-17 16 views
5

Ich verstehe nicht, was falsch istnotifyDataSetChanged() - IndexOutOfBoundException

ich bin

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

UND (die interessanteste)

ich numberToDelete = 1

Diese Zeile wird dann entfernt

enter image description here

aber Objekte enter image description here

und wenn numberToDelete = 0

Diese Zeile dann

entfernt

enter image description here

aber Objekte enter image description here

UND wenn numberToDelete = 2

Objekte

enter image description here

aber nach notifyDataSetChanged(); IndexOutOfBoundException

Ich habe bereits einen Beitrag ... aber ich kann dieses Problem nicht lösen

IndexOutOfBoundException when I use notifyDataSetChanged

stackoverflow.com/a/9260757/1568164 Ich fühle, dass die Situation dies ist, ich benutze aber die Arbeit nicht

Dann bekomme ich eine Position weiter

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; 

    } 

Meine Basis Aktivität zu entfernen, wo Ich nenne die Entnahmeleitung

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

} 

Fortsetzung des Themas ich experimentiert und festgestellt, dass die Strings in der Liste der Adapter wenig mit der Tatsache zu tun haben, dass die Ausgabe auf dem Bildschirm, so dass die Herausforderung verändert. müssen verstehen, wie Zeilen aus dem Bildschirm zu löschen

+0

können Sie den Code zu Ihrer Frage hinzufügen zu beheben links, wo, wenn Sie wählen ein Objekt aus der Tabelle Sie geben den Index dieses Objekts zurück? –

+0

Ich habe hinzugefügt, siehe –

+0

Was ist 'int position', ist dies der Index des gewählten UrlItem? –

Antwort

2

die Lösung war einfach.

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

funktionierte nicht richtig, neu zeichnen die Liste der Fokus hat sich verändert und Linien chaotisch gelöscht .. agonized eine Entscheidung für eine Woche war einfach,