2016-06-08 9 views
0

Когда я долгое время нажимаю любой элемент в представлении списка, отображается панель контекстного действия. Теперь, что я хочу, когда я нажимаю кнопку удаления после выбора элементов, тогда выбранные элементы удаляются, но я не могу получить позицию выбранных элементов. Моего кода для режима мульти выбора:Получить позицию выбранного элемента в режиме действия

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

Когда я нажимаю на кнопке Удалить, то этот метод вызывающая:

deleteScreenedMessageFromInbox(); 

и я должен передать аргумент в этом методе, который является положением выбранные элементы. Код для этого метода:

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

любые решения для этого?

+0

Вы можете держать 'ArrayList ' вне 'MultiChoiceModeListener' и' add' элемент или 'remove' элемент из 'ArrayList' изнутри' onItemCheckedStateChanged' в зависимости от того, является ли 'boolean checked 'истинным или ложным соответственно. Дайте мне знать, если вы хотите, чтобы я расширил это в ответ. –

+0

Да, пожалуйста, предоставьте мне пример кода, так как я немного запутался –

+0

Я внесла некоторые изменения в ваш существующий код и опубликовал это как ответ. Пожалуйста, проверьте. –

ответ

1

Вот что я хотел бы предложить:

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

Затем на вашем deleteScreenedMessageFromInbox() доступа positionsList следующим образом:

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

Вы гений. Он работает как шарм. Спасибо. –

+0

Рад, что я мог бы помочь. :) –

0

реализовать onitemclickListener и получить идентификатор элемента и сохранить его в любой переменной и удалить элемент всякий раз, когда пользователь нажимает на delete и следующий вызов adapter.notifyDataSetChanged();

, например

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

Мне нужно передать целочисленный аргумент в мой метод. Что я пишу в режиме действия? как я передаю значение этому методу –

+0

проверить отредактированный ответ – ManishMenaria

+0

Не работает. Ничего не произошло, когда я нажал кнопку удаления –

 Смежные вопросы

  • Нет связанных вопросов^_^