Search code examples
androidlistviewimagebutton

Deleting multiple selected items in custom listview dosn't work with ImageButton


It's very necessary for me. I am trying to create a delete multiple selected items ListView.The code is running right but when I add an ImageButton to custom_list_row.layout it's not working. I don't know about the problem. Maybe there is the same question but I didn't find it.

Code:

After I use

smsList.setAdapter(customListViewAdapter);

trying to use this code to delete selected items

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

Adapter code:

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

Solution

  • Finally, I found the answer : we have to set

        android:descendantFocusability="blocksDescendants"
    

    in root list item element and set

        android:focusableInTouchMode="true"
    

    in the ImageButton view.