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

FirebaseRecyclerAdapter报错:迁移新适配器时遇CoordinatorLayout$Behavior重复定义

解决你的FirebaseAdapter迁移问题&重复类错误

先搞定眼前的重复类错误

你遇到的Program type already present: android.support.design.widget.CoordinatorLayout$Behavior错误,本质是AndroidX和旧版Support库的依赖冲突。新版Firebase库已经全面迁移到AndroidX了,如果你还在项目里保留着旧的support依赖(比如com.android.support:design),就会出现这种重复类的情况。

解决步骤:

  • 打开你的build.gradle(Module级别的),检查是否还有com.android.support开头的依赖,把它们替换成对应的AndroidX依赖。比如com.android.support:design要换成com.google.android.material:material:1.x.x(x选最新稳定版)。
  • 确保gradle.properties里已经开启AndroidX迁移的配置:
    android.useAndroidX=true
    android.enableJetifier=true
    
  • 执行Clean Project然后Rebuild Project,一般就能解决这个重复类问题了。

新版FirebaseAdapter结合FirebaseOptions和Query的正确姿势

旧版的FirebaseAdapter已经被废弃,现在官方推荐用FirebaseRecyclerAdapter(针对Firebase Realtime Database)或者FirebaseFirestoreRecyclerAdapter(针对Firestore)。结合FirebaseOptions的话,你需要先手动初始化自定义的FirebaseApp实例,再基于这个实例获取数据库引用并创建Query。

针对Firebase Realtime Database的示例

  1. 先配置FirebaseOptions并初始化自定义FirebaseApp:
    FirebaseOptions options = new FirebaseOptions.Builder()
            .setApiKey("YOUR_API_KEY")
            .setApplicationId("YOUR_APP_ID")
            .setDatabaseUrl("YOUR_DATABASE_URL")
            .build();
    
    // 初始化自定义FirebaseApp,避免和默认App冲突
    FirebaseApp secondaryApp = FirebaseApp.initializeApp(context, options, "secondary");
    
  2. 基于自定义App获取Database引用并创建Query:
    FirebaseDatabase database = FirebaseDatabase.getInstance(secondaryApp);
    Query query = database.getReference("your_collection").orderByChild("timestamp").limitToLast(50);
    
  3. 初始化FirebaseRecyclerAdapter:
    // 先定义ViewHolder
    public class YourViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        public YourViewHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.title);
        }
    }
    
    // 创建Adapter
    FirebaseRecyclerAdapter<YourModel, YourViewHolder> adapter = new FirebaseRecyclerAdapter<YourModel, YourViewHolder>(
            YourModel.class,
            R.layout.item_layout,
            YourViewHolder.class,
            query
    ) {
        @Override
        protected void populateViewHolder(YourViewHolder viewHolder, YourModel model, int position) {
            // 绑定数据到UI
            viewHolder.title.setText(model.getTitle());
        }
    };
    
    // 给RecyclerView设置Adapter
    recyclerView.setAdapter(adapter);
    
  4. 别忘了在生命周期里启动/停止监听:
    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
    

针对Firestore的示例

用法逻辑类似,只是换成Firestore对应的API:

// 1. 初始化自定义FirebaseApp(同上)
FirebaseOptions options = new FirebaseOptions.Builder()
        .setApiKey("YOUR_API_KEY")
        .setApplicationId("YOUR_APP_ID")
        .setFirestoreUrl("YOUR_FIRESTORE_URL")
        .build();
FirebaseApp secondaryApp = FirebaseApp.initializeApp(context, options, "secondary");

// 2. 获取Firestore实例并创建Query
FirebaseFirestore db = FirebaseFirestore.getInstance(secondaryApp);
Query query = db.collection("your_collection").orderBy("timestamp", Query.Direction.DESCENDING).limit(50);

// 3. 配置FirestoreRecyclerOptions
FirestoreRecyclerOptions<YourModel> firestoreOptions = new FirestoreRecyclerOptions.Builder<YourModel>()
        .setQuery(query, YourModel.class)
        .build();

// 4. 创建并配置Adapter
FirebaseFirestoreRecyclerAdapter<YourModel, YourViewHolder> adapter = new FirebaseFirestoreRecyclerAdapter<YourModel, YourViewHolder>(firestoreOptions) {
    @Override
    protected void onBindViewHolder(@NonNull YourViewHolder holder, int position, @NonNull YourModel model) {
        // 绑定数据到UI
        holder.title.setText(model.getTitle());
    }

    @NonNull
    @Override
    public YourViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new YourViewHolder(view);
    }
};

// 5. 设置Adapter并管理监听
recyclerView.setAdapter(adapter);
// 生命周期监听同上,调用adapter.startListening()和adapter.stopListening()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:40