web-dev-qa-db-fra.com

Ajouter RecyclerView (RecyclerFragment) à une boîte de dialogue

J'ai mon RecyclerView personnalisé pour créer un ListView. Et cela fonctionne très bien, lorsque j'essaie de remplir une vue de liste dans l'ID de ma mise en page.

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

Maintenant, je voudrais remplir une nouvelle liste dans une boîte de dialogue. Comment puis je faire ça?

J'ai essayé ceci, ayant ma grille comme statique

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

Puis,

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

DialogFragment n'est qu'un autre fragment, gonflez votre vue personnalisée comme vous le feriez pour tout autre fragment.

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

La réponse acceptée fonctionne, mais elle nécessite des efforts supplémentaires pour la conserver davantage comme une boîte de dialogue standard.

Vous trouverez ci-dessous un autre moyen possible, qui vous permettra de conserver toutes les fonctionnalités de la boîte de dialogue (par exemple le titre, l'icône, les boutons positifs/négatifs/neutres). L'idée est de remplacer onCreateDialog et d'utiliser la méthode 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();
    }
}
5
GregoryK

Supposons que vous ayez un fragment statique normal nommé mygrid, voici à quoi devrait ressembler votre 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;
    }
}

Et voici comment vous devez le montrer:

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

L'affichage d'un fragment RecyclerView dans la boîte de dialogue est aussi simple que dans un fragment normal. Mais pour afficher un fragment de dialogue, vous devez créer un dialogue comme:

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

et pour l'appeler à partir de votre fragment ou activité, vous n'avez besoin d'aucun identifiant de conteneur, appelez simplement ces lignes AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);

Il devrait faire votre travail sinon s'il vous plaît faites le moi savoir.

2
Ankur Chaudhary