如何从Recyclerview适配器消除对话框片段

时间:2019-05-26 18:05:44

标签: java android

一个愚蠢的问题,但是我是Android的新手,我花了几个小时环顾四周,但找不到答案。

我有一个带有recyclerview的对话框片段。我希望当用户单击recyclerview项时关闭对话框。如何在recyclerview适配器中从侦听器调用dismiss()?

我在对话框片段中尝试了recyclerview的侦听器,但是它什么也不做。请帮忙。

这是对话框片段。在onClick底部将其关闭:

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

}

recyclerview在每行上都有一张眼睛的图片。我想加载一个新片段并在单击眼睛时关闭对话框片段。这是适配器代码:

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

}

谢谢

2 个答案:

答案 0 :(得分:0)

  1. 将接收DialogFragment的构造函数添加到适配器,并将其另存为字段。
  2. 创建适配器时,请12

  3. 在onClick调用中DialgFragment.dismiss();

答案 1 :(得分:0)

对于 Kotlin 用户

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

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