【问题标题】:How to dismiss a dialog fragment from a recyclerview adapter如何从 recyclerview 适配器中关闭对话框片段
【发布时间】:2021-06-29 19:37:27
【问题描述】:

一个愚蠢的问题,但我是 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);
}

}

谢谢

【问题讨论】:

  • 你能分享你当前不工作的代码吗?
  • 是的,就像 tamir 说的,你应该展示一些需要帮助的代码,监听器必须工作,可能你以错误的方式实现
  • 谢谢大家。我已经添加了代码。一切正常,但我不知道如何关闭对话框并加载新片段。

标签: java android


【解决方案1】:
  1. 向适配器添加一个接收 DialogFragment 并将其保存为字段的构造函数。
  2. 当您创建适配器时,请执行new EvMySchedAdapter(dayList, EvMySchedDlg.this);

  3. 在onClick里面调用diagFragment.dismiss();

【讨论】:

  • 当你知道如何简单时:-) 非常感谢。
  • 请问您能回答这个问题吗?只需点击 V 标记
  • 我是新手。你的意思是像我刚刚做的那样吗?
  • 如果这对 Kotlin 用户有帮助,在类构造函数声明 class SomeAdapter(private val fragment: SomeFragment) : RecyclerView.Adapter&lt;SomeAdapter.SomeHolder&gt;() { 中传递片段也可以正常工作。
【解决方案2】:

对于 Kotlin 用户

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多