2016-06-08 18 views
0

Wenn ich lange auf ein Element in der Listenansicht drücke, wurde die Kontext-Aktionsleiste angezeigt. Nun, was ich will, dass, wenn ich die Löschen-Taste nach der Auswahl von Elementen drücken, dann die ausgewählten Elemente gelöscht werden, aber ich bin nicht in der Lage, die Position der ausgewählten Elemente zu erhalten. Mein Code für Multi Wahl-Modus ist:Die Position des ausgewählten Elements im Aktionsmodus abrufen

listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

    @Override 
    public void onItemCheckedStateChanged(ActionMode mode, int position, 
             long id, boolean checked) { 
     mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected"); 

    } 

    @Override 
    public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu: 
       deleteScreenedMessageFromInbox();          
        mode.finish(); 
       return true; 
      default: 
       return false; 
     } 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     // Inflate the menu for the CAB 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.contextual, menu); 
     return true; 
    } 


    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 
}); 

Wenn ich auf Schaltfläche Löschen klicken dann diese Methode aufrufen wird:

deleteScreenedMessageFromInbox(); 

und ich habe ein Argument in dieser Methode zu übergeben, die die Position von ausgewählte Artikel. Code für diese Methode ist:

public void deleteScreenedMessageFromInbox(Integer position) { 

Integer id = smsIDs.get(position); 

String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id; 

DBsms smsDb = new DBsms(this); 
SQLiteDatabase dbw = smsDb.getWritableDatabase(); 
dbw.execSQL(deleteScreenedMessage); 
dbw.close(); 

irgendwelche Lösungen dafür?

+0

Sie könnten ein 'Arraylist halten' außerhalb des 'MultiChoiceModeListener' und' add' ein Element oder 'remove' ein Element von der 'ArrayList' aus innerhalb' onItemCheckedStateChanged' abhängig davon, ob 'boolean checked' auf 'true' oder 'false' gesetzt ist. Lassen Sie es mich wissen, wenn Sie möchten, dass ich dies zu einer Antwort ausweiten kann. –

+0

Ja, bitte geben Sie mir einen Beispielcode, da ich ein bisschen verwirrt bin –

+0

Ich habe einige Änderungen an Ihrem bestehenden Code vorgenommen und diese als Antwort gepostet. Bitte prüfe. –

Antwort

1

Hier ist, was würde ich vorschlagen:

List<Integer> positionsList = new ArrayList<>();//declare this as a member variable--outside of any method 
listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

@Override 
public void onItemCheckedStateChanged(ActionMode mode, int position, 
            long id, boolean checked) { 
    mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected"); 
    if(checked) 
     positionsList.add(position) 
    else 
     positionsList.remove(position) 
} 

@Override 
public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu: 
      deleteScreenedMessageFromInbox();          
       mode.finish(); 
      return true; 
     default: 
      return false; 
    } 
} 

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    // Inflate the menu for the CAB 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.contextual, menu); 
    return true; 
} 


@Override 
public void onDestroyActionMode(ActionMode mode) { 

} 

@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    return false; 
} 
}); 

Dann auf Ihrem deleteScreenedMessageFromInbox() Zugang positionsList wie so:

public void deleteScreenedMessageFromInbox() { 

    DBsms smsDb = new DBsms(this); 
    SQLiteDatabase dbw = smsDb.getWritableDatabase(); 

    for(int position : positionsList) { 
     Integer id = smsIDs.get(position); 

     String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id; 
     dbw.execSQL(deleteScreenedMessage); 
    } 
    dbw.close(); 
} 
+0

Du bist genial. Es funktioniert wie ein Charme Danke :) –

+0

Ich bin froh, dass ich helfen konnte. :) –

0

Implementieren Sie den onitemclickListener und erhalten Sie die Element-ID und speichern Sie sie in einer beliebigen Variable und löschen Sie das Element immer wenn Benutzer auf löschen klicken und als nächstes adapter.notifyDataSetChanged();

zum Beispiel

listViewMessages.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View v, int position, 
          long arg3) { 
     //you can pass position from here to your method like this 
     deleteScreenedMessageFromInbox(position) 


     String value = (String) adapter.getItemAtPosition(position); 
     adapter.remove(value); 
     adapter.notifyDataSetChanged();    
    } 
}); 
+0

Ich muss ein Integer-Argument an meine Methode übergeben. Was schreibe ich in den Aktionsmodus? wie ich Wert an diese Methode übergeben –

+0

Überprüfen Sie die bearbeitete Antwort – ManishMenaria

+0

Nicht funktioniert. Es ist nichts passiert, als ich auf die Löschtaste geklickt habe –