Удаление нескольких выбранных элементов в настраиваемом представлении списка не работает с ImageButton - PullRequest
0 голосов
/ 05 сентября 2018

Это очень необходимо для меня. Я пытаюсь создать 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Наконец я нашел ответ: мы должны установить

    android:descendantFocusability="blocksDescendants"

в элементе корневого списка и установите

    android:focusableInTouchMode="true"

в представлении ImageButton.

0 голосов
/ 06 сентября 2018

Я добавляю onClickListner в ваш метод getView. Пожалуйста, попробуйте

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());
    holder.click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              convertView.performClick();
            }
        });
    return convertView;
}
...