2010-11-08 6 views
0

Je semble avoir un problème avec Android ListView. J'essaie de supprimer l'élément sélectionné de ListView. La méthode delete fonctionne et me permettra de supprimer autant d'éléments de ma liste que nécessaire, mais chaque fois que je défilerai vers le bas de la liste (après qu'un élément au moins ait été supprimé), j'obtiens une erreur qui ferme l'application.Problème avec Android ListView après la suppression des éléments

Voici mon code:

public class MainActivity extends Activity { 

    private String[] mRoute; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mRoute = getResources().getStringArray(R.array.countries); 

    ListView list = (ListView)findViewById(R.id.list); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem,  mRoute); 

    list.setAdapter(adapter); 

    registerForContextMenu(list); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 

     AdapterView.AdapterContextMenuInfo info (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
     int menuItemIndex = item.getItemId(); 
     String[] menuItems = getResources().getStringArray(R.array.menu); 
     String menuItemName = menuItems[menuItemIndex]; 
     String listItemName = mRoute[info.position]; 

     // Remove String From List 
     List<String> routeArrayString = new ArrayList<String>(Arrays.asList(mRoute)); 
    routeArrayString.remove(listItemName); 
    mRoute = routeArrayString.toArray(mRoute); 

     //Generate new ListView 
     ListView list = (ListView)findViewById(R.id.list); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, mRoute); 
    list.setAdapter(adapter); 
    registerForContextMenu(list); 

     return true; 

     } 

Toutes les idées? Merci d'avance.

+1

Quel est le message d'erreur? – Brandon

+0

Utilisez logcat pour nous montrer la pile complète du message d'erreur. –

Répondre

0

Quelle erreur se produit? Quoi qu'il en soit, votre code est un peu moche et cela devrait être écrit d'une autre manière. Vous devriez travailler avec votre adaptateur car c'est comme un pont entre votre liste et les données réelles. BasicAdapter a des méthodes spéciales pour notifier les changements de données, il suffit d'hériter de votre propre adaptateur et de manipuler les données directement via l'adaptateur.

+0

Erreur: Android s'est arrêté de manière inattendue. Voulez-vous dire le BaseAdapter? http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html – j3ffz

+0

regardez logcat et donnez une description d'erreur plus spécifique, il doit y avoir une exception. – endryha

0

Je pense que l'ajout d'éléments au tableau dans mon adaptateur était le problème.

public class MainActivity extends ListActivity { 

    private ArrayAdapter<String> dataAdapter; 
    private static final int REMOVE_ITEM = 1; 

    private String[] mRoute = {"One", "Two", "Three", "Four", "Five"}; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     dataAdapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.itemName); 

     for (int i = 0; i < mRoute.length; i++) { 
      dataAdapter.add(mRoute[i]); 
     } 

     setListAdapter(dataAdapter); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     Resources resource = getApplicationContext().getResources(); 
     menu.add(Menu.NONE,REMOVE_ITEM, REMOVE_ITEM, "REMOVE ITEM"); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) 
     { 
     case REMOVE_ITEM: 
      dataAdapter.remove(dataAdapter.getItem(dataAdapter.getCount() - 1)); 
      break; 
     } 
     return false; 
    } 


} 

Travaux!

Questions connexes