You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决FirebaseRecyclerAdapter中打开BottomSheetDialogFragment的报错问题

解决FirebaseRecyclerAdapter中打开BottomSheetDialogFragment的问题

Adapter本身并非Fragment或Activity子类,无法直接调用getSupportFragmentManager(),以下是三种可行的解决方式:

方法一:构造函数传入FragmentManager

直接在Adapter的构造函数中接收FragmentManager,后续调用即可:

  1. 修改Adapter构造函数,添加FragmentManager参数:
public class updateRoomAdapter extends FirebaseRecyclerAdapter<model,updateRoomAdapter.myViewHolder> {
    private FragmentManager fragmentManager;

    public updateRoomAdapter(@NonNull FirebaseRecyclerOptions<model> options, FragmentManager fragmentManager) {
        super(options);
        this.fragmentManager = fragmentManager;
    }

    @Override
    protected void onBindViewHolder(@NonNull myViewHolder holder,final int position, @NonNull model model) {
        // ... 原有绑定逻辑
        holder.edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UpdateRoomFragment updateRoomFragment=new UpdateRoomFragment();
                updateRoomFragment.show(fragmentManager, updateRoomFragment.getTag());
            }
        });
    }

    // ... 其他代码不变
}
  1. 在宿主创建Adapter时传入对应FragmentManager:
    • Activity中:new updateRoomAdapter(options, getSupportFragmentManager())
    • Fragment中:new updateRoomAdapter(options, getChildFragmentManager())

方法二:通过View的Context获取Activity的FragmentManager

从点击的View中获取Context,强转为AppCompatActivity后调用getSupportFragmentManager():

holder.edit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Context context = v.getContext();
        if (context instanceof AppCompatActivity) {
            UpdateRoomFragment updateRoomFragment=new UpdateRoomFragment();
            updateRoomFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), updateRoomFragment.getTag());
        }
    }
});

注意:需确保Context是AppCompatActivity类型,避免类型转换崩溃

方法三:接口回调(推荐,解耦设计)

通过定义点击回调接口,让宿主Activity/Fragment负责打开BottomSheet,Adapter仅处理点击事件通知:

  1. 定义回调接口:
public interface OnEditRoomClickListener {
    void onEditRoomClicked(model roomModel);
}
  1. 修改Adapter添加接口成员并触发回调:
public class updateRoomAdapter extends FirebaseRecyclerAdapter<model,updateRoomAdapter.myViewHolder> {
    private OnEditRoomClickListener listener;

    public updateRoomAdapter(@NonNull FirebaseRecyclerOptions<model> options, OnEditRoomClickListener listener) {
        super(options);
        this.listener = listener;
    }

    @Override
    protected void onBindViewHolder(@NonNull myViewHolder holder,final int position, @NonNull model model) {
        // ... 原有绑定逻辑
        holder.edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onEditRoomClicked(model);
            }
        });
    }

    // ... 其他代码不变
}
  1. 宿主实现接口并处理BottomSheet打开逻辑:
public class YourHostActivity extends AppCompatActivity implements OnEditRoomClickListener {
    // ... 其他逻辑
    @Override
    public void onEditRoomClicked(model roomModel) {
        UpdateRoomFragment updateRoomFragment = new UpdateRoomFragment();
        // 可选:传递roomModel数据到Fragment
        Bundle bundle = new Bundle();
        bundle.putString("roomId", roomModel.getRoomId());
        bundle.putString("description", roomModel.getDescription());
        updateRoomFragment.setArguments(bundle);
        
        updateRoomFragment.show(getSupportFragmentManager(), updateRoomFragment.getTag());
    }
}
  1. 创建Adapter时传入实现了接口的宿主:
updateRoomAdapter adapter = new updateRoomAdapter(options, this);

内容的提问来源于stack exchange,提问作者RIZWAN ALI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:50