recyclerview databinding cardview android android-fragments android-alertdialog android-recyclerview

android - databinding - Agregar RecyclerView(RecyclerFragment) a un cuadro de diálogo



databinding recyclerview android (4)

Tengo mi RecyclerView personalizado para crear un ListView. Y funciona muy bien, cuando intento rellenar una vista de lista en la identificación de mi diseño.

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

Ahora, me gustaría rellenar una nueva lista dentro de un diálogo. ¿Cómo puedo hacer eso?

Probé esto, teniendo mygrid como estática.

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

Y entonces,

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


DialogFragment es solo otro fragmento. Infle su vista personalizada como lo haría con cualquier otro fragmento.

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


La respuesta aceptada funciona, pero requiere esfuerzos adicionales para mantenerla como un diálogo estándar.

A continuación se muestra otra forma posible, que le permitirá mantener toda la funcionalidad del diálogo (por ejemplo, título, icono, botones positivo / negativo / neutral). La idea es anular onCreateDialog y usar el 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(); } }


Mostrar un RecyclerView en el fragmento de diálogo es tan simple como lo hace en el fragmento normal. Pero para mostrar en el fragmento de diálogo necesita crear un diálogo como:

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

y para llamarlo desde su fragmento o actividad, no necesita ningún ID de contenedor, simplemente llame a esta línea AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null); AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);

Debería hacer tu trabajo si no, por favor házmelo saber.


Supongamos que tiene un fragmento normal estático llamado mygrid, así es como debería verse su DialogFragment:

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

Y aquí es cómo debes mostrarlo:

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