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

Android Studio 3.4中startListening()失效及CircleImageView崩溃问题

解决你的Android Studio + FirebaseRecyclerAdapter + 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数据库的变化,自然不会加载任何数据。

解决方案

  1. 把适配器改成类成员变量:在MainActivity类里声明FirebaseRecyclerAdapter的成员变量,这样生命周期方法可以访问到它。
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:38:07