2016-11-09 2 views
-1

ich die folgende Störung erhalte beim Versuch bestimmten Eintrag aus Listview und hashmap zu löschen:Fehler beim Abruf während bestimmten Eintrag zu entfernen von Listview und hashmap

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
        at java.util.ArrayList.get(ArrayList.java:411) 
        at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349) 
        at android.widget.AdapterView.getItemAtPosition(AdapterView.java:790) 
        at com.example.cmmalli.helloworld.MainActivity.onContextItemSelected(MainActivity.java:120) 
        at android.app.Activity.onMenuItemSelected(Activity.java:3224) 
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:406) 
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195) 
        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:103) 
        at com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback.onMenuItemSelected(PhoneWindow.java:3722) 
        at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761) 
        at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904) 
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894) 
        at com.android.internal.view.menu.MenuPopup.onItemClick(MenuPopup.java:128) 
        at android.widget.AdapterView.performItemClick(AdapterView.java:310) 
        at android.widget.AbsListView.performItemClick(AbsListView.java:1155) 
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3126) 
        at android.widget.AbsListView$3.run(AbsListView.java:4041) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

mein Code:

public class MainActivity extends AppCompatActivity { 

ArrayAdapter adapter; 
TextView user_name; 
TextView user_amount; 
ImageButton addbtn; 
ListView listView; 
HashMap<String, Double> myMap = new HashMap<String, Double>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    user_name = (TextView) findViewById(R.id.nameeditText); 
    user_amount = (TextView) findViewById(R.id.amounteditText); 
    addbtn = (ImageButton)findViewById(R.id.moreImageButton); 
    listView = (ListView)findViewById(R.id.simple_list_item_1); 
    registerForContextMenu(listView); 

    adapter = new ArrayAdapter<User>(
      MainActivity.this, 
      android.R.layout.simple_list_item_1); 

    listView.setAdapter(adapter); 

    addbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String name = user_name.getText().toString(); 
      Double amount = Double.parseDouble(user_amount.getText().toString()); 
      adapter.add(new User(name, amount)); 
      adapter.notifyDataSetChanged(); 
      myMap.put(name,amount); 

      Iterator myVeryOwnIterator = myMap.keySet().iterator(); 
      while(myVeryOwnIterator.hasNext()) { 
       Toast.makeText(getBaseContext(), (String) myVeryOwnIterator.next(), 
         Toast.LENGTH_SHORT).show(); 
      } 

     } 
    }); 



} 


@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle("Options"); 
    if (v.getId()==R.id.simple_list_item_1) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_list, menu); 
    } 
} 


@Override 
public boolean onContextItemSelected(MenuItem item) { 
    android.widget.AdapterView.AdapterContextMenuInfo info = (android.widget.AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    switch(item.getItemId()) { 
     case R.id.edit: 
      //edit name or amount here 
      return true; 
     case R.id.delete: 
      adapter.remove(listView.getItemAtPosition(info.position)); 
      adapter.notifyDataSetChanged(); 
      myMap.remove(listView.getItemAtPosition(info.position)); 
      return true; 
     case R.id.deleteall: 
      adapter.clear(); 
      adapter.notifyDataSetChanged(); 
      myMap.clear(); 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 


public class User { 
    public String name; 
    public double amount; 

    public User(String name, double amount) { 
     this.name = name; 
     this.amount = amount; 
    } 

    @Override 
    public String toString() { 
     return format("%s : %.2f", this.name, this.amount); 
    } 
} 

Auf lange Klicken Sie in der Listenansicht auf eine Zeile, um Optionen zum Bearbeiten, Löschen und Löschen zu erhalten. Alle Optionen löschen, aber die Option für bestimmte Zeilen löscht einen Fehler. Ich bin mir nicht sicher, wo ich falsch liege. Vorschläge würden sehr geschätzt werden. Ich versuche Username und Betrag vom Benutzer zu übernehmen und dann in der Listview anzuzeigen und das Schlüsselwertpaar in einer Hashmap zu speichern, damit es auch editiert werden kann.

+0

Ich versuche HashMapAdapter einen benutzerdefinierten Adapter zu verwenden, der den Basisadapter dafür erweitert, aber nicht sicher ist, wie er Werte festlegen und abrufen kann. Ich bin mir auch nicht sicher, wie man den HashMapadapter auf listview setzt und wie man Werte setzt und bekommt. es wäre toll, wenn jemand mir das auch ein bisschen näher bringen könnte. Verwenden des folgenden benutzerdefinierten Adapterbeispiels [http://stackoverflow.com/questions/5234576/what-adapter-shall-i-use-to-use-hashmap-in-a-listview/40531313#40531313] – charsi

+0

Ihr Adapter ist leer , anscheinend. Wie können Sie einen Gegenstand auswählen, um ihn zu löschen? –

Antwort

0

Ihr Fehler ist, dass der Adapter leer ist, also müssen Sie einige Daten hinzufügen, bevor Sie beginnen können, Dinge daraus zu löschen.

Ich bin mir nicht sicher, warum Sie die HashMap benötigen, aber wenn Sie ein Element aus dem Adapter entfernen möchten, benötigen Sie wahrscheinlich eine ArrayList.

(I umbenannt das Listview-ID, weil es keine einfache Listenelement ist)

public class MainActivity extends AppCompatActivity { 

    ArrayAdapter<User> adapter; 
    List<User> users; // added 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     listView = (ListView)findViewById(R.id.listView); 
     registerForContextMenu(listView); 

     users = new ArrayList<User>(); // added 

     adapter = new ArrayAdapter<User>(
       MainActivity.this, 
       android.R.layout.simple_list_item_1 
       users); // added 

     listView.setAdapter(adapter); 
     // listView.setOnLongClickListener... // You also could use this... 

Ich habe nicht mit Kontextmenüs viel Erfahrung, aber ich stelle mir vor so etwas wie dieses

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle("Options"); 
    if (v.getId()==R.id.listView) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_list, menu); 
    } 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    final int index = info.position; 
    final User u = users.get(index); // or adapter.getItem(index); 

    switch(item.getItemId()) { 
     case R.id.edit: 
      //edit name or amount here 
      return true; 
     case R.id.delete: 
      users.remove(index); 
      adapter.notifyDataSetChanged(); 
      return true; 
     case R.id.deleteall: 
      users.clear(); 
      adapter.notifyDataSetChanged(); 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 
+0

Ich brauche hashmap, um Schlüsselwert-Paare von Benutzern und ihren jeweiligen Mengen zu erstellen, so dass sie bearbeitet werden können und ich kann Mathe auf die Beträge der einzelnen Benutzer tun. ArrayList lässt mich keine Schlüsselwertpaare behalten. – charsi

+0

Ihre 'Benutzer'-Objekte können direkt geändert werden. 'BeispielUser.Name =" neuer Name "'. Und benachrichtigen Sie den Adapter, und die Daten sollten aktualisiert werden –

Verwandte Themen