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的示例
- 先配置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"); - 基于自定义App获取Database引用并创建Query:
FirebaseDatabase database = FirebaseDatabase.getInstance(secondaryApp); Query query = database.getReference("your_collection").orderByChild("timestamp").limitToLast(50); - 初始化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); - 别忘了在生命周期里启动/停止监听:
@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
相关产品推荐
相关产品推荐

