首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Andorid AlertDialog multiselect -允许用户添加选项

Andorid AlertDialog multiselect -允许用户添加选项
EN

Stack Overflow用户
提问于 2021-10-05 06:55:07
回答 1查看 32关注 0票数 0

我正在尝试创建一个警告对话框,用户可以从预定义的列表中选择多个选项,但是如果他们想要选择的选项不在那里,他们可以添加它们(通过edittext和“添加”按钮)。

到目前为止,我已经使用setCustomTitle将edittext和按钮添加到对话框的顶部,并且我能够将该项添加到我的源数据列表中,但是我不知道如何将其重新应用于对话框中的列表。

(筛选器模型只有一个字符串和一个布尔值来确定它是否被选中,所以如果用户重新打开对话框,我可以设置选定的项)

这是我到目前为止的代码。

代码语言:javascript
复制
 private void selectSomething() {
        AlertDialog.Builder selectSomethingBuilder = new AlertDialog.Builder(mContext);
        View header = getLayoutInflater().inflate(R.layout.common_multichoice_dialog_header, null);
        Button addButton = header.findViewById(R.id.btAdd);
        EditText et = header.findViewById(R.id.textView2);
        selectSomethingBuilder.setCustomTitle(header);
        addButton.setOnClickListener(v -> {
            cuisineList.add(new filterModel(et.getText().toString(), true));
            boolean[] selectedItems2 = new boolean[cuisineList.size()];
            for (int i = 0; i < cuisineList.size(); i++) {
                selectedItems2[i] = cuisineList.get(i).isSelected();
            }
            String[] updatedList = cuisineList.stream().map(filterModel::toString).toArray(String[]::new);

            //What to do here? How do I update the list of items with the newly added item

            et.setText("");

        });

        boolean[] selectedItems = new boolean[cuisineList.size()];
        for (int i = 0; i < cuisineList.size(); i++) {
            selectedItems[i] = cuisineList.get(i).isSelected();
        }
        selectSomethingBuilder.setMultiChoiceItems(cuisineList.stream().map(filterModel::toString).toArray(String[]::new), selectedItems,
                (dialog, which, isChecked) -> cuisineList.get(which).setSelected(isChecked));
        selectSomethingBuilder.setPositiveButton(R.string.ok, (dialog, id1) -> {
            setCuisineChips();
        });
        AlertDialog selectItems = selectSomethingBuilder.create();

        selectItems.show();
    }
EN

回答 1

Stack Overflow用户

发布于 2021-10-06 07:27:34

好的,我是通过扩展AlertDialog.Builder实现的--对于遇到这种情况的任何人,这里是我正在使用的类:

代码语言:javascript
复制
public class multichoiceUserAddableDialog extends AlertDialog.Builder {
    private final Context context;
    private final MultiAdapter adapter;

    public multichoiceUserAddableDialog(Context context, List<filterModel> selectList) {
        super(context);
        this.context = context;

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View header = inflater.inflate(R.layout.common_multichoice_dialog_header, null);
        Button addButton = header.findViewById(R.id.btAdd);
        EditText et = header.findViewById(R.id.textView2);
        this.setCustomTitle(header);
        adapter = new MultiAdapter(context, android.R.layout.simple_list_item_multiple_choice, selectList);

        addButton.setOnClickListener(v -> {
            selectList.add(new filterModel(et.getText().toString(), et.getText().toString(), true));
            et.setText("");
            adapter.notifyDataSetChanged();
        });
        setAdapter(adapter, (dialogInterface, i) -> {
          
        });

    }

    @Override
    public AlertDialog create() {
        AlertDialog x = super.create();
        x.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                ((filterModel) adapterView.getItemAtPosition(i)).setSelected(!((filterModel) adapterView.getItemAtPosition(i)).isSelected());
                adapter.notifyDataSetChanged();
            }
        });
        return x;
    }

    private class MultiAdapter extends ArrayAdapter<filterModel> {
        private List<filterModel> selectList;
        ViewHolder holder;

        public MultiAdapter(@NonNull Context context, int resource, @NonNull List<filterModel> selectList) {
            super(context, resource, selectList);
            this.selectList = selectList;
        }

        class ViewHolder {
            CheckedTextView itemTV;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if (convertView == null) {
                convertView = inflater.inflate(
                        android.R.layout.simple_list_item_multiple_choice, null);

                holder = new ViewHolder();
                holder.itemTV = convertView.findViewById(android.R.id.text1);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.itemTV.setText(selectList.get(position).getText());
            holder.itemTV.setChecked(selectList.get(position).isSelected());
            return convertView;
        }

    }

}

然后按如下方式使用:

代码语言:javascript
复制
 multichoiceUserAddableDialog selectSomethingBuilder = new multichoiceUserAddableDialog(mContext, activityList);
        selectSomethingBuilder.setPositiveButton(R.string.ok, (dialog, id1) -> {
            setActivityChips();
        });
        AlertDialog selectItems = selectSomethingBuilder.create();
     
        selectItems.show();

filterModel有一个文本字段和一个布尔值(以及您想要的任何其他字段),标题布局有一个editText和一个按钮(加上一个带有一些静态文本的textview )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69446055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档