2012-08-17 10 views
5

No entiendo lo que está malnotifyDataSetChanged() - IndexOutOfBoundException

Soy utilizar

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

Y (la más interesante)

consigo numberToDelete = 1

Esta línea luego se elimina

enter image description here

pero los objetos enter image description here

y cuando numberToDelete = 0

Esta línea se retira entonces

enter image description here

pero objetos enter image description here

y cuando numberToDelete = 2

objetos

enter image description here

pero después de notifyDataSetChanged(); IndexOutOfBoundException

ya tengo un post ... pero no puedo resolver este problema

IndexOutOfBoundException when I use notifyDataSetChanged

stackoverflow.com/a/9260757/1568164 me siento que la situación es la siguiente, yo uso pero no funciona

entonces consigo una posición para eliminar adicionalmente

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; 

    } 

Mi Actividad base donde Me llamo la tubería de evacuación de

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

} 

continuando con el tema he experimentado y llegado a la conclusión de que las cadenas de la lista de adaptadores tienen poco que ver con el hecho de que la salida a la pantalla, por lo que el desafío está cambiando. necesita entender cómo eliminar filas de la pantalla

+0

se puede añadir el código a su pregunta, donde, cuando Si elige un objeto de la tabla, ¿devuelve el índice de ese objeto? –

+0

Agregué por favor vea –

+0

¿Qué es 'int position', es este el índice del UrlItem elegido? –

Respuesta

2

la solución fue simple.

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

no funcionaba correctamente, volver a dibujar la lista de enfoque ha cambiado y las líneas de borrado caótica .. agónica durante una semana una decisión era simple, deja de fijar

Cuestiones relacionadas