Это очень необходимо для меня. Я пытаюсь создать delete multiple selected items ListView
. Код работает правильно, но когда я добавляю ImageButton
в custom_list_row.layout, он не работает. Я не знаю о проблеме. Может быть, есть тот же вопрос, но я не нашел его.
Код:
После того, как я использую
smsList.setAdapter(customListViewAdapter);
пытается использовать этот код для удаления выбранных элементов
smsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
smsList.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
final int checkedCount = smsList.getCheckedItemCount();
// Set the CAB title according to total checked items
mode.setTitle(checkedCount + " Selected");
// Calls toggleSelection method from ListViewAdapter Class
customListViewAdapter.toggleSelection(position);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.delete_menu_option, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
// call getSelectedIds method from customListViewAdapter
SparseBooleanArray selected = customListViewAdapter.getSelectedIds();
// Captures all selected ids with a loop
for (int i = (selected.size() - 1); i >= 0; i--) {
if (selected.valueAt(i)) {
SmsClass selectedListItem = (SmsClass) customListViewAdapter.getItem(selected.keyAt(i));
// Remove selected items using ids
customListViewAdapter.remove(selectedListItem);
}
}
mode.finish();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
customListViewAdapter.removeSelection();
}
});
Код адаптера:
public class CustomListViewAdapter extends ArrayAdapter{
Context context;
private SparseBooleanArray selectedListItemsIds;
List multipleSelectionList;
public CustomListViewAdapter(Context context, int resourceId, List items) {
super(context, resourceId, items);
this.context = context;
selectedListItemsIds = new SparseBooleanArray();
this.multipleSelectionList = items;
}
/*private view holder class*/
private class ViewHolder {
ImageView imgCountryFlag;
TextView txtCountryName;
TextView txtCountryCode;
ImageButton click;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
SmsClass rowItem = (SmsClass) getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate( R.layout.list_item_row, null);
holder = new ViewHolder();
holder.txtCountryCode = (TextView) convertView.findViewById(R.id.name);
holder.txtCountryName = (TextView) convertView.findViewById(R.id.date);
holder.click = (ImageButton)convertView.findViewById( R.id.click);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtCountryCode.setText(rowItem.getBody());
holder.txtCountryName.setText(rowItem.getNumberInside());
return convertView;
}
public void remove(SmsClass object) {
multipleSelectionList.remove(object);
notifyDataSetChanged();
}
public void toggleSelection(int position) {
selectView(position, !selectedListItemsIds.get(position));
}
public void removeSelection() {
selectedListItemsIds = new SparseBooleanArray();
notifyDataSetChanged();
}
public void selectView(int position, boolean value) {
if (value)
selectedListItemsIds.put(position, value);
else
selectedListItemsIds.delete(position);
notifyDataSetChanged();
}
public int getSelectedCount() {
return selectedListItemsIds.size();
}
public SparseBooleanArray getSelectedIds() {
return selectedListItemsIds;
}
}