Подтвердить что ты не робот

Добавить RecyclerView (RecyclerFragment) в диалог

У меня есть свой пользовательский RecyclerView для создания ListView. И он отлично работает, когда я пытаюсь заполнить список в моем идентификаторе макета.

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

Теперь я хотел бы заполнить новый список внутри диалогового окна. Как я могу это сделать?

Я попробовал это, имея mygrid как static

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

И затем,

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

Ответ 1

DialogFragment - это всего лишь еще один фрагмент, надуйте свой пользовательский вид, как и для любого другого фрагмента.

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

Ответ 2

Принятый ответ работает, но он требует дополнительных усилий, чтобы он больше напоминал стандартный диалог.

Ниже приведен еще один возможный способ, который позволит вам сохранить все функциональные возможности диалога (например, название, значок, кнопки с положительным/отрицательным/нейтральным). Идея состоит в том, чтобы переопределить onCreateDialog и использовать метод 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();
    }
}

Ответ 3

Предположим, что у вас есть статический нормальный фрагмент с именем mygrid, вот как ваш диалог должен выглядеть так:

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

И вот как вы должны это показать:

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

Ответ 4

Отображение RecyclerView в фрагменте диалога так же просто, как и в обычном фрагменте. Но для отображения в диалоговом окне диалога вам необходимо создать диалоговое окно, подобное:

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

и для вызова его из вашего фрагмента или действия вам не нужен какой-либо идентификатор контейнера, который просто вызывает эту строку   AppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);

Он должен делать вашу работу, если не сообщите мне.