DialogFragment с пользовательским ListView
Я пытаюсь создать DialogFragment, который показывает диалог с пользовательским ListView внутри.
public class MultiSelectDialogCustom extends DialogFragment {
ListView mLocationList;
private ArrayList<String> mOfficeListItems = new ArrayList<String>();
public static MultiSelectDialogCustom newInstance(int title) {
MultiSelectDialogCustom dialog = new MultiSelectDialogCustom();
Bundle args = new Bundle();
args.putInt("title", title);
dialog.setArguments(args);
return dialog;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Collections.addAll(mOfficeListItems, getResources().getStringArray(R.array.offices));
View v = inflater.inflate(R.layout.fragment_choice_list, container,
true);
mLocationList = (ListView)v.findViewById(R.id.location_criteria_list);
final FunctionListArrayAdapter adapter = new FunctionListArrayAdapter(
this, android.R.layout.simple_list_item_1, mOfficeListItems);
mLocationList.setAdapter(adapter);
getDialog().setTitle(getArguments().getInt("title"));
return v;
}
}
При вызове из фрагмента:
MultiSelectDialogCustom dialogFrag = MultiSelectDialogCustom_.newInstance(R.string.dialog_title);
dialogFrag.show(getActivity().getSupportFragmentManager(), null);
Он показывает только пустой диалог с заголовком... почему мой список не отображается?
3 ответа
Вместо того, чтобы использовать onCreateView
ты должен быть приоритетным onCreateDialog
и внутри это будет выглядеть примерно так:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Collections.addAll(mOfficeListItems, getResources().getStringArray(R.array.offices));
View v = getActivity().getLayoutInflater().inflate(R.layout.fragment_choice_list, null);
mLocationList = (ListView)v.findViewById(R.id.location_criteria_list);
final FunctionListArrayAdapter adapter = new FunctionListArrayAdapter(
this, android.R.layout.simple_list_item_1, mOfficeListItems);
mLocationList.setAdapter(adapter);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(getArguments().getInt("title")).setView(v);
return builder.create();
}
Эта цитата из DialogFragment
Страница документации описывает, что вы пытаетесь сделать:
Реализации должны переопределить этот класс и реализовать
onCreateView(LayoutInflater, ViewGroup, Bundle)
предоставить содержание диалога. Кроме того, они могут переопределитьonCreateDialog(Bundle)
создать полностью настраиваемый диалог, такой какAlertDialog
, со своим содержанием.
В твоем случае похоже onCreateDialog
это путь, так как вы хотите сделать собственный внутренний вид.
То, что я забыл, было:
view.setAdapter(adapter);
после того как я добавил, что код работал
Может быть, вы упускаете что-то очень маленькое, но важное. Ты скучаешь notifyDataSetChanged()
в вашем адаптере?
"Как только вы добавили новый элемент в адаптер, вы должны позвонить notifyDataSetChanged()
таким образом listview
обновляется новым набором данных, найденным в адаптере."