web-dev-qa-db-ja.com

RecyclerView(RecyclerFragment)をダイアログに追加

ListViewを作成するカスタムのRecyclerViewがあります。また、レイアウトのIDにリストビューを追加しようとすると、うまく機能します。

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を静的として、これを試しました

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

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

受け入れられた回答は機能しますが、標準のダイアログのように保つには追加の努力が必要です。

以下は、すべてのダイアログ機能(タイトル、アイコン、正/負/中立ボタンなど)を保持できる別の方法です。アイデアは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();
    }
}
5
GregoryK

静的normal mygridという名前のフラグメントがあると仮定します。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;
    }
}

そして、ここにあなたがそれをどのように示すべきかがあります:

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

ダイアログフラグメントで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();
    }
}
_

フラグメントまたはアクティビティから呼び出すには、コンテナIDは必要ありませんAppDialogs appDialogs = AppDialogs.newInstance(0, title, msg); appDialogs.setCancelable(false); appDialogs.show(getFragmentManager(), null);という行を呼び出すだけです

そうでなければ私に知らせてくださいあなたの仕事をする必要があります。

2
Ankur Chaudhary