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 обновляется новым набором данных, найденным в адаптере."

Другие вопросы по тегам