13

Ich habe meine benutzerdefinierte RecyclerView zum Erstellen einer ListView. Und es funktioniert gut, wenn ich versuche, eine Listenansicht in die ID meines Layouts zu füllen.Hinzufügen von RecyclerView (RecyclerFragment) zu einem Dialog

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
Bundle bundle = new Bundle(); 
bundle.putBoolean("enablePullToRefresh", false); 
GridValues gridValues = new GridValues(); 
gridValues.rowViewLayout = R.layout.my_detail_row_view; 

gridValues.delegate = this; 

mygrid = new CustomGridView(gridValues, bundle); 
mygrid.showAsGrid = true; 
mygrid.spanCount = 2; 
mygrid.layoutOrientation = LinearLayoutManager.VERTICAL; 
mygrid.noRowColor = true; 
mygrid.gridName = "mygrid"; 

mygrid.setArguments(mygrid.bundle); 
ft.replace(R.id.MyGridContainer, mygrid); 

Jetzt möchte ich eine neue Liste in einem Dialog auffüllen. Wie kann ich das tun?

Ich versuchte dies, mygrid als statische

public static class MyDialogFragment extends DialogFragment { 
    static MyDialogFragment newInstance() { 
     return new MyDialogFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mygrid.getView(); 
    } 
} 

Und dann hat,

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
DialogFragment newFragment = MyDialogFragment.newInstance(); 
ft.add(R.id.MyGridContainer, newFragment); 
//getView().findViewById(R.id.MyGridContainer).setVisibility(View.VISIBLE); 
ft.commit(); 
+1

einfach die gleiche Logik gelten Sie für die * normal * 'Fragment' angewendet – Blackbelt

+0

Warum Sie AlertDialog.Builder Methode nicht verwenden? Dort können Sie addView() –

+0

@Blackbelt aufrufen, ich habe das mit der FragmentTransaction versucht, aber leider hat es nicht funktioniert. Ich bin mir der Kernkonzepte nicht sehr bewusst, und ich bin immer noch ein Lerner. –

Antwort

28

DialogFragment ist nur ein weiteres Fragment, inflationieren Sie Ihre benutzerdefinierte Ansicht wie Sie für jedes andere Fragment tun würde.

3

wird angenommen, dass Sie eine statische normalen Fragment namens mygrid haben, hier ist, wie Sie Ihre DialogFragment aussehen sollte :

public class MyDialogFragment extends DialogFragment { 
    static MyDialogFragment newInstance() { 
     return new MyDialogFragment(); 
    } 

    // this method create view for your Dialog 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mygrid.getView(); 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = new Dialog(getActivity()); 
     return dialog; 
    } 
} 

Und hier ist, wie Sie sho Zeigen Sie es:

DialogFragment fragment = MyDialogFragment.newInstance(); 
fragment.show(getSupportFragmentManager(), "some tag"); // please refer to DialogFragment#show() method in documentations. 
3

Das Anzeigen eines RecyclerView im Dialogfragment ist so einfach wie im normalen Fragment. Aber im Dialogfragment zeigen Sie einen Dialog zu schaffen, müssen wie:

public class AppDialogs extends DialogFragment { 
private AlertDialog.Builder builder; 

public static AppDialogs newInstance(int dialogNo, String title, String msg) 
{ 
    AppDialogs fragment = new AppDialogs(); 
    Bundle args = new Bundle(); 
    args.putInt("dialogNo",dialogNo); 
    args.putString("title", title); 
    args.putString("msg", msg); 
    fragment.setArguments(args); 

    return fragment; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    if(android.os.Build.VERSION.SDK_INT<=android.os.Build.VERSION_CODES.KITKAT) { 
     getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(0, 0, 0, 0))); 
    } 
    return null; 
} 


@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    Bundle bundle = getArguments(); 
    int pos = bundle.getInt("dialogNo"); 
    switch (pos) { 
     case 0: 
      return showList(); 


    } 

    return super.onCreateDialog(savedInstanceState); 

} 


private Dialog showList() { 
    builder = new AlertDialog.Builder(getActivity(), R.style.app_dialog_theme); 
    builder.setTitle(title); 


RecyclerView rView; 
    builder.setView(rView); 

     return builder.create(); 
    } 
} 

und es von Ihrem Fragment anrufen oder Aktivität, die Sie brauchen nicht alle Behälter ID rufen Sie einfach diese Zeile AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);

Es sollte tun, um Ihre Arbeit, wenn nicht, lass es mich wissen.

4

Akzeptierte Antwort funktioniert, aber es erfordert zusätzliche Anstrengungen, um es mehr wie Standarddialog zu halten.

Unten finden Sie eine weitere Möglichkeit, mit der Sie alle Dialogfunktionen (z. B. Titel, Symbol, positive/negative/neutrale Schaltflächen) beibehalten können. Die Idee ist, onCreateDialog außer Kraft zu setzen und verwenden AlertDialog.Builder#setView() Methode

public class MyDialogFragment extends DialogFragment { 
    private RecyclerView mRecyclerView; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     mRecyclerView = new RecyclerView(getContext()); 
     // you can use LayoutInflater.from(getContext()).inflate(...) if you have xml layout 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
     mRecyclerView.setAdapter(/* your adapter */); 

     return new AlertDialog.Builder(getActivity()) 
       .setTitle(/* your title */) 
       .setView(mRecyclerView) 
       .setPositiveButton(android.R.string.ok, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           // do something 
          } 
         } 
       ).create(); 
    } 
}