У меня есть 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
.Как я должен это делать?