简体   繁体   中英

How to dismiss a dialog fragment from a recyclerview adapter

A silly question but I am new to Android and I've spent a few hours looking around but can't find the answer.

I have a dialog fragment with a recyclerview in it. I want the dialog to close when the user clicks a recyclerview item. How do I call dismiss() from the listener in recyclerview adapter?

I've tried a listener for the recyclerview in the dialog fragment but it does nothing. please help.

This is the dialog fragment. At the bottom onClick dismisses it:

public class EvMySchedDlg extends DialogFragment implements View.OnClickListener {
View view;
String eventId;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.event_my_sched, container, false);

    ImageView closeButton = view.findViewById(R.id.closeButton3);
    closeButton.setOnClickListener(this);
    final TextView eventNameBox = view.findViewById(R.id.eventNameBox);
    eventNameBox.setOnClickListener(this);
    TextView coNameBox = view.findViewById(R.id.coNameBox);

    Bundle extraData = getArguments();
    eventId = extraData.getString("eventId");
    String coName = extraData.getString("coName");
    String eventName = extraData.getString("eventName");

    coNameBox.setText(coName);
    eventNameBox.setText(eventName);
    //get list of days from server
    String userId = ((DrawerActivity)getContext()).getUserData("userId");
    final String[] cred = new String[]{"user_id", userId, "event_id", eventId};
    VolleyCalls.postRequest(this.getContext(), "getEventDays", cred, new VolleyCalls.ServerReply() {
        @Override
        public void onSuccess(String theReply){
            final List<EvMySchedData> dayList = new ArrayList<>();
            EvMySchedAdapter tAdapter = new EvMySchedAdapter(dayList);

            RecyclerView recyclerView = view.findViewById(R.id.schedRecycler);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(recyclerView.getContext());
            recyclerView.setLayoutManager(mLayoutManager);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(tAdapter);
            tAdapter.emptyRecycler();

            try {
                JSONObject jsonServerReply = new JSONObject(theReply);
                int evCount = jsonServerReply.getInt("recCount");

                EvMySchedData thisLine;

                if (evCount > 0) {
                    JSONObject cRec =null;
                    for (int thisRec=0; thisRec<evCount; thisRec++ ) {
                        cRec = jsonServerReply.getJSONObject(String.valueOf(thisRec));
                        thisLine = new EvMySchedData(cRec.getString("day_date"), cRec.getString("day_times"), cRec.getString("role"), cRec.getString("room"), view.getContext());
                        dayList.add(thisLine);
                    }
                }

            } catch (Exception e) {

            }
        }
        public void onError(String error) {

        }
    });

    return view;
} // end onCreateView

public void onClick(View v) {
    this.dismiss();
}

}

The recyclerview has the picture of an eye on each line. I want to load a new fragment and close the dialog fragment when the eye is clickd. This is the adapter code:

public class EvMySchedAdapter extends RecyclerView.Adapter<EvMySchedAdapter.EventViewHolder> {

private List<EvMySchedData> dayList;

public EvMySchedAdapter(List<EvMySchedData> dayList) {
    this.dayList = dayList;
}

@Override
public EvMySchedAdapter.EventViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.event_my_sched_row, parent, false);
    ImageView eye = itemView.findViewById(R.id.dayOverviewButton);

    try {
        eye.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

//Load a new fragment 
//dismiss the dialog
            }
        });

    } catch (Exception e) {

    }

    return new EvMySchedAdapter.EventViewHolder(itemView);
}

@Override
public void onBindViewHolder(EvMySchedAdapter.EventViewHolder holder, int position) {
    holder.dayDateBox.setText(dayList.get(position).getDayDate());
    holder.dayTimeBox.setText(dayList.get(position).getDayTime());
    holder.dayRoleBox.setText(dayList.get(position).getDayRole());
    holder.dayRoomBox.setText(dayList.get(position).getDayRoom());

} // end onBindViewHolder

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

public class EventViewHolder extends RecyclerView.ViewHolder {
    public TextView dayDateBox;
    public TextView dayTimeBox;
    public TextView dayRoleBox;
    public TextView dayRoomBox;
    public Context context;

    public EventViewHolder(View view) {
        super(view);
        dayDateBox = view.findViewById(R.id.dateBox);
        dayTimeBox = view.findViewById(R.id.timeBox);
        dayRoleBox = view.findViewById(R.id.roleBox);
        dayRoomBox = view.findViewById(R.id.roomBox);
    }
}

public void emptyRecycler() {
    final int size = dayList.size();
    dayList.clear();
    notifyItemRangeRemoved(0, size);
}

}

Thanks

  1. Add to the adapter a constructor that receive DialogFragment and save it as a field.
  2. When you create the Adapter do new EvMySchedAdapter(dayList, EvMySchedDlg.this);

  3. Inside the onClick call dialgFragment.dismiss();

for Kotlin Users

class SomeAdapter(private val dialog: BottomSheetDialog):RecyclerView.Adapter<SomeAdapter.ViewHolder>()

holder.itemView.setOnClickListener{
dialog.dismiss()
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM