Frage DialogFragment mit benutzerdefinierter ListView


Ich versuche ein DialogFragment zu erstellen, das einen Dialog mit einem benutzerdefinierten ListView anzeigt.

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;
    }


}

Wenn es von einem Fragment aufgerufen wird:

MultiSelectDialogCustom dialogFrag = MultiSelectDialogCustom_.newInstance(R.string.dialog_title);
dialogFrag.show(getActivity().getSupportFragmentManager(), null);

Es zeigt nur einen leeren Dialog mit dem Titel ... warum wird meine Liste nicht angezeigt?


6
2017-12-03 16:08


Ursprung


Antworten:


Anstatt zu verwenden onCreateView Sie sollten Vorrang haben onCreateDialog und im Inneren sieht es ungefähr so ​​aus:

@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();
}

Dieses Zitat von der DialogFragment  Dokumentationsseite beschreibt, was Sie versuchen zu tun:

Implementierungen sollten diese Klasse überschreiben und implementieren onCreateView(LayoutInflater, ViewGroup, Bundle) um den Inhalt des Dialogs zu liefern. Alternativ können sie überschreiben onCreateDialog(Bundle) um ein vollständig benutzerdefiniertes Dialogfeld zu erstellen, z. B. ein AlertDialogmit eigenem Inhalt.

In Ihrem Fall scheint es so onCreateDialog ist der Weg zu gehen, da Sie eine benutzerdefinierte innere Ansicht machen wollen.


11
2017-12-03 16:19



Vielleicht fehlt dir etwas sehr Kleines, aber Wichtiges. Vermisst du notifyDataSetChanged() in deinem Adapter?

"Sobald Sie das neue Element zum Adapter hinzugefügt haben, müssen Sie anrufen notifyDataSetChanged() so, dass die listview aktualisiert sich mit den neuen Daten, die im Adapter enthalten sind. "


0
2017-12-03 16:29



Was ich vergessen habe war:

view.setAdapter(adapter);

nachdem ich hinzugefügt habe, dass der Code funktioniert hat


0
2017-11-10 22:10