Android Studio 3.4中startListening()失效及CircleImageView崩溃问题
看起来你遇到了两个棘手的问题:启动时的InflateException崩溃,以及FirebaseRecyclerAdapter无法加载帖子内容。我来一步步帮你解决:
一、解决CircleImageView的ScaleType崩溃问题
问题原因
从报错日志可以明确看到:java.lang.IllegalArgumentException: ScaleType FIT_CENTER 不被支持。de.hdodenhof.circleimageview.CircleImageView这个库不支持FIT_CENTER这个缩放类型,它只支持以下几种ScaleType:
- CENTER
- CENTER_CROP
- CENTER_INSIDE
解决方案
找到你布局文件(应该是all_posts_layout.xml,因为崩溃发生在加载这个布局时)里的CircleImageView组件,把它的android:scaleType属性改成支持的类型,比如centerCrop:
<de.hdodenhof.circleimageview.CircleImageView android:id="@+id/post_profile_image" ... android:scaleType="centerCrop" <!-- 替换原来的fitCenter --> ... />
如果你的nav_header.xml里也用了CircleImageView,最好也检查一下它的scaleType,避免后续出现同样问题。
二、解决FirebaseRecyclerAdapter无法加载帖子的问题
问题原因
你现在的FirebaseRecyclerAdapter是DisplayAllUsersPosts()方法里的局部变量,导致你无法在onStart()里调用startListening();另外,注释掉startListening()后,适配器不会开始监听Firebase数据库的变化,自然不会加载任何数据。
解决方案
- 把适配器改成类成员变量:在MainActivity类里声明FirebaseRecyclerAdapter的成员变量,这样生命周期方法可以访问到它。
- 在onStart()里调用startListening(),onStop()里调用stopListening():遵循FirebaseRecyclerAdapter的生命周期规范,确保在Activity可见时开始监听,不可见时停止,避免内存泄漏。
修改后的代码如下:
首先,在MainActivity类里添加成员变量:
public class MainActivity extends AppCompatActivity { // 其他成员变量... private FirebaseRecyclerAdapter<Posts, PostsViewHolder> firebaseRecyclerAdapter; // 新增这个成员变量 // ... 其他代码 }
然后修改DisplayAllUsersPosts()方法,把适配器赋值给成员变量:
private void DisplayAllUsersPosts() { FirebaseRecyclerOptions<Posts> options = new FirebaseRecyclerOptions.Builder<Posts>().setQuery(PostsRef, Posts.class).build(); firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, PostsViewHolder>(options) { // 赋值给成员变量 @Override protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Posts model) { holder.username.setText(model.getFullname()); holder.time.setText(" " + model.getTime()); holder.date.setText(" " + model.getDate()); holder.description.setText(model.getDescription()); Picasso.get().load(model.getProfileimage()).into(holder.user_post_image); Picasso.get().load(model.getPostimage()).into(holder.postImage); } @NonNull @Override public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.all_posts_layout, parent, false); PostsViewHolder viewHolder = new PostsViewHolder(view); return viewHolder; } }; postlist.setAdapter(firebaseRecyclerAdapter); }
最后,在MainActivity里重写onStop()方法,并修改onStart()方法:
@Override protected void onStart() { super.onStart(); FirebaseUser currentUser = mAuth.getCurrentUser(); if (currentUser == null) { SendUserToLoginActivity(); } else { CheckUserExistence(); if(firebaseRecyclerAdapter != null){ firebaseRecyclerAdapter.startListening(); // 在这里启动监听 } } } @Override protected void onStop() { super.onStop(); if(firebaseRecyclerAdapter != null){ firebaseRecyclerAdapter.stopListening(); // 停止监听,避免内存泄漏 } }
这样修改后,当Activity进入前台时,适配器就会开始监听Firebase数据库的帖子数据,你就能看到帖子内容了。
这两个修改应该能解决你遇到的所有问题,先处理CircleImageView的崩溃问题,再解决Firebase数据加载的问题,祝你调试顺利!
内容的提问来源于stack exchange,提问作者Bablu

