13

Ho il mio RecyclerView personalizzato per creare un ListView. E funziona benissimo, quando sto cercando di popolare una vista elenco nell'ID del mio layout.Aggiungi RecyclerView (RecyclerFragment) a un 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); 

Ora, desidero compilare una nuova lista all'interno di una finestra di dialogo. Come posso farlo?

ho provato questo, vista myGrid come statico

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

E poi,

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

semplicemente applicare la stessa logica è stato applicato per la * 'Fragment' – Blackbelt

+0

Perché non utilizzare il metodo normale AlertDialog.Builder *? Lì puoi chiamare addView() –

+0

@Blackbelt, ho provato ad usare FragmentTransaction ma sfortunatamente non ha funzionato. Non sono molto consapevole dei concetti chiave e sono ancora uno studente. –

risposta

28

DialogFragment è solo un altro frammento, Gonfiare la visualizzazione personalizzata come si farebbe per qualsiasi altro frammento.

public class MyDialogFragment extends DialogFragment { 
    private RecyclerView mRecyclerView; 
    private MyRecyclerAdapter adapter; 
    // this method create view for your Dialog 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      //inflate layout with recycler view 
     View v = inflater.inflate(R.layout.fragment_dialog, container, false); 
     mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     //setadapter 
     CustomAdapter adapter = new MyRecyclerAdapter(context, customList); 
      mRecyclerView.setAdapter(adapter); 
     //get your recycler view and populate it. 
     return v; 
    } 
} 
3

Si supponga di avere una statica normale Frammento di nome mygrid, ecco come il tuo DialogFragment dovrebbe essere simile :

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

Ed ecco come si scatta ULD vederlo:

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

Mostrando un RecyclerView nella finestra frammento è così semplice come si fa in frammento normale. Ma per mostrare nel dialogo frammento è necessario creare una finestra di dialogo come:

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

e chiamarlo dal frammento o attività non avete bisogno di qualsiasi ID contenitore basta chiamare questi linea AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);

Dovrebbe fare la tua lavoro se non per favore fammi sapere.

4

La risposta accettata funziona, ma richiede ulteriori sforzi per renderlo più simile alla finestra di dialogo standard.

Di seguito è riportato un altro modo possibile, che consente di mantenere tutte le funzionalità di dialogo (ad esempio titolo, icona, pulsanti positivo/negativo/neutro). L'idea è quella di ignorare onCreateDialog e utilizzare il metodo AlertDialog.Builder#setView()

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