cartAdapter中startListening()与stopListening()方法无法解析问题求助
解决调用
startListening()和stopListening()时的方法找不到错误 我在调用startListening()和stopListening()时出现错误,相关代码如下:
Fragment代码
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_app_cart,container,false); recyclerView = view.findViewById(R.id.recylervieww); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); cartmodelList = new ArrayList<>(); cartadapt = new cartAdapter(getActivity(),cartmodelList); recyclerView.setAdapter(cartadapt); FirebaseRecyclerOptions<Cartmodel> options = new FirebaseRecyclerOptions.Builder<Cartmodel>() .setQuery(FirebaseDatabase.getInstance().getReference().child("Cart List"), Cartmodel.class) .build(); cartadapt = new cartAdapter(options); recyclerView.setAdapter(cartadapt); return view; } @Override public void onStart() { super.onStart(); cartadapt.startListening(); } @Override public void onStop() { super.onStop(); cartadapt.stopListening(); }
cartAdapter代码
public class cartAdapter extends RecyclerView.Adapter<cartAdapter.ViewHolder> { Context context; List<Cartmodel> cartmodelList; public cartAdapter(Context context, List<Cartmodel> cartmodelList) { this.context = context; this.cartmodelList = cartmodelList; } public cartAdapter(FirebaseRecyclerOptions<Cartmodel> options) { } @NonNull @Override public cartAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_singlero,parent,false)); } @Override public void onBindViewHolder(@NonNull cartAdapter.ViewHolder holder, int position) { holder.productName.setText(cartmodelList.get(position).getProductName()); holder.quantity.setText(cartmodelList.get(position).getQuantity()); holder.totalPrice.setText(cartmodelList.get(position).getTotalPrice()); Glide.with(holder.itemView.getContext()).load(Cartmodel.productImage()).into(holder.productImage); } @Override public int getItemCount() { return cartmodelList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView date,productName,productPrice,quantity,totalPrice; ImageView productImage; public ViewHolder(@NonNull View itemView) { super(itemView); productName = itemView.findViewById(R.id.pnametext); quantity = itemView.findViewById(R.id.quantity); totalPrice = itemView.findViewById(R.id.totalprice); productImage = itemView.findViewById(R.id.img2); } } }
报错信息
Cannot resolve method 'startListening' in 'cartAdapter'
Cannot resolve method 'stopListening' in 'cartAdapter'
说明:我在其他Activity中使用这两个类时未出现此类错误,请求帮助解决。
问题原因及修复方案
1. 核心问题
startListening()和stopListening()是FirebaseUI库中FirebaseRecyclerAdapter类的专属方法,你的cartAdapter当前仅继承了基础的RecyclerView.Adapter,因此无法识别这两个方法。
2. 修复步骤
修改适配器继承关系
将cartAdapter改为继承FirebaseRecyclerAdapter,同时保留原有构造方法以兼容普通列表场景:
public class cartAdapter extends FirebaseRecyclerAdapter<Cartmodel, cartAdapter.ViewHolder> { Context context; List<Cartmodel> cartmodelList; // 普通列表构造方法(兼容原有Activity场景) public cartAdapter(Context context, List<Cartmodel> cartmodelList) { // 传入空的Firebase查询参数避免初始化报错 super(new FirebaseRecyclerOptions.Builder<Cartmodel>().setQuery(FirebaseDatabase.getInstance().getReference(), Cartmodel.class).build()); this.context = context; this.cartmodelList = cartmodelList; } // Firebase列表构造方法(当前Fragment使用) public cartAdapter(FirebaseRecyclerOptions<Cartmodel> options) { super(options); } @NonNull @Override public cartAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_singlero, parent, false)); } @Override protected void onBindViewHolder(@NonNull cartAdapter.ViewHolder holder, int position, @NonNull Cartmodel model) { // 直接使用Firebase传入的model对象,无需从本地list获取 holder.productName.setText(model.getProductName()); holder.quantity.setText(model.getQuantity()); holder.totalPrice.setText(model.getTotalPrice()); Glide.with(holder.itemView.getContext()).load(model.getProductImage()).into(holder.productImage); } // 区分两种场景的条目数量返回 @Override public int getItemCount() { if (cartmodelList != null) { return cartmodelList.size(); } return super.getItemCount(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView productName, quantity, totalPrice; ImageView productImage; public ViewHolder(@NonNull View itemView) { super(itemView); productName = itemView.findViewById(R.id.pnametext); quantity = itemView.findViewById(R.id.quantity); totalPrice = itemView.findViewById(R.id.totalprice); productImage = itemView.findViewById(R.id.img2); } } }
优化Fragment代码
Fragment中先后创建了两个适配器实例,第一个普通适配器可以直接删除,保留Firebase适配器即可:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_app_cart,container,false); recyclerView = view.findViewById(R.id.recylervieww); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); FirebaseRecyclerOptions<Cartmodel> options = new FirebaseRecyclerOptions.Builder<Cartmodel>() .setQuery(FirebaseDatabase.getInstance().getReference().child("Cart List"), Cartmodel.class) .build(); cartadapt = new cartAdapter(options); recyclerView.setAdapter(cartadapt); return view; }
修改完成后,startListening()和stopListening()方法即可正常调用,同时也能兼容你在其他Activity中使用普通列表的场景。
内容的提问来源于stack exchange,提问作者Aditya Singh Rajput
相关产品推荐
相关产品推荐

