我正在尝试创建一个警告对话框,用户可以从预定义的列表中选择多个选项,但是如果他们想要选择的选项不在那里,他们可以添加它们(通过edittext和“添加”按钮)。
到目前为止,我已经使用setCustomTitle将edittext和按钮添加到对话框的顶部,并且我能够将该项添加到我的源数据列表中,但是我不知道如何将其重新应用于对话框中的列表。
(筛选器模型只有一个字符串和一个布尔值来确定它是否被选中,所以如果用户重新打开对话框,我可以设置选定的项)
这是我到目前为止的代码。
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();
}发布于 2021-10-06 07:27:34
好的,我是通过扩展AlertDialog.Builder实现的--对于遇到这种情况的任何人,这里是我正在使用的类:
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;
}
}
}然后按如下方式使用:
multichoiceUserAddableDialog selectSomethingBuilder = new multichoiceUserAddableDialog(mContext, activityList);
selectSomethingBuilder.setPositiveButton(R.string.ok, (dialog, id1) -> {
setActivityChips();
});
AlertDialog selectItems = selectSomethingBuilder.create();
selectItems.show();filterModel有一个文本字段和一个布尔值(以及您想要的任何其他字段),标题布局有一个editText和一个按钮(加上一个带有一些静态文本的textview )。
https://stackoverflow.com/questions/69446055
复制相似问题