Как мне показать DialogFragment из OnClick на RecyclerView? - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть Fragment (FragmentColourSets), который показывает RecyclerView.Я хочу иметь возможность щелкнуть по элементу в RecyclerView, а затем увидеть DialogFragment, показывающий информацию об этом элементе.Я ожидал, что в RecyclerView будет OnClickListener, который справится с этим, но теперь я вижу, что его нет, и я застрял.Решения, которые я нашел, включали добавление прослушивателя щелчков в адаптере, но оттуда я не могу получить доступ к FragmentManager или Context, чтобы показать DialogFragment.

Итак, соответствующиеЧасть макета FragmentColourSets выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_colour_sets"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Класс FragmentColourSets (я пропустил некоторые несущественные вещи, чтобы сократить его):

public class FragmentColourSets extends Fragment {

    private ArrayList<ColourSet> mColourSets;
    private Context             mContext;
    private FirebaseFirestore   mDb;
    private RecyclerView        mRVColourSets;
    private String              mUid;

    private FragmentManager     mFragmentManager;

    static public FragmentCurrentColourSets newInstance(Context context, ArrayList<ColourSet> colourSets) {

        FragmentCurrentColourSets f = new FragmentColourSets();
        f.setRequiredData(context, colourSets);

        return f;
    }

    public void setRequiredData(Context context, ArrayList<ColourSet> colourSets) {

        this.mContext = context;
        this.mCurrentColourSets = colourSets;

    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        // Inflate layout
        View rootView = inflater.inflate(R.layout.fragment_colour_sets, container, false);

        mRVColourSets = rootView.findViewById(R.id.rv_colour_sets);

        mFragmentManager = getChildFragmentManager();

        // Set up Layout Manager, and set Recycler View to use it
        LinearLayoutManager mManager = new LinearLayoutManager(getActivity());
        mManager.setReverseLayout(true);
        mManager.setStackFromEnd(true);
        mRVColourSets.setLayoutManager(mManager);

        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mContext = getActivity();

    }

    // Set colour sets to be shown
    public void setColourSets(ArrayList<ColourSet> coloursets) {
        mColourSets = coloursets;
        fillView();
    }

    public void setUid(String thisUid) { mUid = thisUid; }

    public void setDb(FirebaseFirestore db) { mDb = db; }

    /**
     * fillView
     * List current Colour Sets in recycler view
     * This takes the colour sets and shows them
     **/
    private void fillView() {

        if(mRVColourSets == null)   return;
        if(mColourSets == null) return;

        AdapterListColourSets mAdapter = new AdapterListColourSets(mColourSets);

        mRVColourSets.setAdapter(mAdapter);

    }

}

AdapterListColourSets is:

public class AdapterListColourSets extends RecyclerView.Adapter<AdapterListColourSets.ViewHolderColourSet> {

        private ArrayList<ColourSet>    colourSets;

        public AdapterListColourSets(ArrayList<ColourSet> colourSets) {
            this.colourSets=colourSets;
        }

        @NonNull
        @Override
        public ViewHolderColourSet onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View layoutColourSets = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_colour_set, null);
            return new ViewHolderColourSet(layoutColourSets);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolderColourSet holder, int position) {
            holder.colourSetName.setText(colourSets.get(position).getName());

        }

        @Override
        public int getItemCount() {
            return colourSets.size();
        }

        class ViewHolderColourSet extends RecyclerView.ViewHolder {

            TextView colourSetName, colourSetKey;

            ViewHolderColourSet(View itemView) {
                super(itemView);

                colourSetName = itemView.findViewById(R.id.tv_colour_set_name);
                colourSetKey = itemView.findViewById(R.id.tv_colour_set_key);

            }
        }
    }

Итак, в какой-то момент мне нужно подключить прослушиватель OnClick к каждому элементу, показанному в RecyclerView, чтобы я мог сделать что-то вроде этого:

private void onClick() {

    DFEditColourSet dfEdit 
           = DFEditColourSet.newInstance(mContext);
    dfEdit.show(mFragmentManager, "Edit Colour Set");
}

Однако внутри адаптера у меня нет доступа к Context или FragmentManager.Как я должен это делать?

1 Ответ

1 голос
/ 11 апреля 2019

Есть много ресурсов, которые показывают вам, как это можно сделать.Взгляните на это сообщение в блоге .Что касается вашего вопроса о том, что контекст не доступен в вашем адаптере: просто передайте его как аргумент конструктора. Это можно увидеть в этом примере хранилища .

Обмен данными между двумя фрагментами можно сделать с помощью SharedViewModel

Если вы не можете понять это, не стесняйтесь спрашивать большевопросы.

РЕДАКТИРОВАТЬ Я также нашел этот ответ на похожий вопрос, который мог бы предложить решение, более простое для реализации, чем упомянутое в блоге сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...