【问题标题】:RecyclerView returns null when activity is resumed活动恢复时 RecyclerView 返回 null
【发布时间】:2018-10-31 23:23:32
【问题描述】:

我有一个 recyclerView,它在活动启动时工作正常。当我从那个活动中去另一个并回来时,recyclerView 是空的。它什么也不显示,但有时它会返回值但布局受到干扰,即项目之间可能存在间隙,或者布局与活动顶部有很大的间隙。

类的代码是:

public class product_page extends AppCompatActivity {

  FirebaseAuth mAuth;
  String s, product;
  ProgressDialog progressDialog;
  private RecyclerView recyclerView;
  FirebaseDatabase firebaseDatabase;
  DatabaseReference databaseReference;
  DatabaseReference db;
  FirebaseRecyclerAdapter<ProductItemsConstructor, productViewHolder> FirebaseAdapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_product_page);

        Intent intent = getIntent();
        s = intent.getExtras().getString("pos");
        product = intent.getExtras().getString("product");

    mAuth = FirebaseAuth.getInstance();
    firebaseDatabase = FirebaseDatabase.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference();

    RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
   // RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());


    Query query = firebaseDatabase.getReference().child("Products").child(s).child(product).orderByKey();

    FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<ProductItemsConstructor>().setQuery(query,ProductItemsConstructor.class).build();

    FirebaseAdapter = new FirebaseRecyclerAdapter<ProductItemsConstructor, productViewHolder>(options) {


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

        @Override
        protected void onBindViewHolder(@NonNull productViewHolder holder, int position, @NonNull ProductItemsConstructor model) {
            holder.Heading(model.getHeading());
            holder.Price(model.getPrice());
            holder.Prates(model.getPprice());
            holder.Rating(model.getRating());
            holder.setImg(getApplicationContext(),model.getImageUrl());
        }
    };
    recyclerView.setAdapter(FirebaseAdapter);

}


@Override
protected void onStart() {
    super.onStart();

    FirebaseAdapter.startListening();
    recyclerView.setAdapter(FirebaseAdapter);
}

@Override
protected void onStop() {
    super.onStop();
    FirebaseAdapter.stopListening();
}

@Override
protected void onResume() {
    super.onResume();

    FirebaseAdapter.notifyDataSetChanged();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent in = new Intent(product_page.this, MainActivity.class);
    startActivity(in);
}

public class productViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView head, rate, Prate, rating;
    ImageView img;


    public productViewHolder(final View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
    }

    private void Heading(String heading) {
        head = (TextView) itemView.findViewById(R.id.Pheading);
        head.setText(heading);
    }

    private void Price(String price) {
        rate = (TextView) itemView.findViewById(R.id.Pprice);
        rate.setText(price);
    }

    private void Prates(String prate){
        Prate = (TextView)itemView.findViewById(R.id.pRate);
        Prate.setText(prate);
    }

    private void Rating(String rting){
        rating = (TextView)itemView.findViewById(R.id.Rating);
        rating.setText(rting);
    }

    private void setImg(Context ctx, String img1) {
        img = (ImageView) itemView.findViewById(R.id.PImage);
        Picasso.with(ctx).load(img1).placeholder(R.drawable.notification).into(img);
        // progressDialog.dismiss();
    }
}

这是第一次启动activity时的图像

enter image description here

这是恢复活动时的图像

enter image description here

日志如下所示

$ adb shell am start -n "com.strease.user.strease/com.strease.user.strease.SplashScreen" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 客户尚未准备好..等待进程上线 连接到设备 motorola-moto_g__4_-ZY223L3X8L 上的进程 22007 从应用程序捕获和显示 logcat 消息。可以在“调试器”设置页面的“Logcat 输出”部分禁用此行为。 W/System:ClassLoader 引用了未知路径:/data/app/com.strease.user.strease-2/lib/arm W/DynamiteModule:未找到 com.google.firebase.auth 的本地模块描述符类。 W/DynamiteModule:未找到 com.google.firebase.auth 的本地模块描述符类。 I/BiChannelGoogleApi: [FirebaseAuth: ] 没有后备模块;未设置延迟初始化 D/FirebaseAuth:通知有关用户的 id 令牌侦听器 (1wU7rrZpvLRCJeXeRITJkIXTu492)。 D/FirebaseApp:com.google.firebase.crash.FirebaseCrash 未链接。跳过初始化。 V/FA:取消作业。职位编号:1598141556 W/DynamiteModule:未找到 com.google.firebase.auth 的本地模块描述符类。 V/FA:注册的活动生命周期回调 I/FirebaseInitProvider:FirebaseApp 初始化成功 W/art:在 Android 4.1 之前,方法 android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode)错误地覆盖了 android.graphics.drawable.Drawable 中的包私有方法 V/FA: onActivityCreated I/FirebaseAuth: [FirebaseAuth:] 通过 FirebaseOptions 加载模块。 I/FirebaseAuth: [FirebaseAuth:] 准备创建与 gms 实现的服务连接 V/FA:收集已启用 应用包,google app id: com.strease.user.strease, 1:841596997979:android:0ece7b89e3bda9c3 I/FA:App 测量正在启动,版本:11910 启用调试日志运行: adb shell setprop log.tag.FA VERBOSE 要启用更快的调试模式事件日志记录,请运行: adb shell setprop debug.firebase.analytics.app com.strease.user.strease D/FA:启用调试级消息记录 V/FA:连接到远程服务 V/FA:连接尝试已在进行中 V/FA:连接尝试已在进行中 活动恢复,时间:33782085 I/FA:未找到跟踪代码管理器,因此不会使用 D/FA: 记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_screen_class(_sc)=SplashScreen, firebase_screen_id(_si)=-132049841330100120}] D/FirebaseApp:通知身份验证状态侦听器。 D/FirebaseApp:通知 0 个身份验证状态侦听器。 I/Adreno:高通构建:7d18700,I8ee426a9a2 建造日期 : 10/07/16 OpenGL ES 着色器编译器版本:XE031.09.00.03 本地分支:mybranch22308589 远程分支:quic/LA.BR.1.3.6_rb1.6 远程分支:无 重建分支:没有 V/FA:连接尝试已在进行中 I/OpenGLRenderer:初始化的 EGL,版本 1.4 D/OpenGLRenderer:交换行为 1 D/FA:连接到远程服务 V/FA:处理排队服务任务:4 V/FA:记录用户参与度,毫秒:4017 V/FA:活动暂停,时间:33786100 D/FA: 记录事件 (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto,engagement_time_msec(_et)=4017, firebase_screen_class(_sc)=SplashScreen, firebase_screen_id(_si)=-132049841330100120}] V/FA: onActivityCreated V/FA: onActivityCreated I/DynamiteModule:考虑本地模块 com.google.android.gms.firebase_database:4 和远程模块 com.google.android.gms.firebase_database:6 V/FA:活动恢复,时间:33786801 I/DynamiteModule:com.google.android.gms.firebase_database 的选定远程版本,版本 >= 6 D/FA: 记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=SplashScreen, firebase_previous_id(_pi)=-132049841330100120, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si )=-132049841330100119}] W / System:ClassLoader引用了未知路径: W/System:ClassLoader 引用了未知路径:/data/user_de/0/com.google.android.gms/app_chimera/m/000000cd/n/armeabi-v7a W/系统:类加载器引用未知路径:/data/user_de/0/com.google.android.gms/app_chimera/m/000000cd/n/armeabi W/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() 返回 Gms W/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() 返回 Gms D/FirebaseAuth:通知有关用户的 id 令牌侦听器 (1wU7rrZpvLRCJeXeRITJkIXTu492)。 D/NetworkSecurityConfig:未指定网络安全配置,使用平台默认值 D/FirebaseApp:通知身份验证状态侦听器。 D/FirebaseApp:通知 1 个身份验证状态侦听器。 D/FirebaseAuth:通知有关用户的 id 令牌侦听器 (1wU7rrZpvLRCJeXeRITJkIXTu492)。 D/FirebaseApp:通知身份验证状态侦听器。 D/FirebaseApp:通知 1 个身份验证状态侦听器。 W/ClassMapper:在类 com.strease.user.strease.userInfoConstructor 上找不到 FCM 令牌的设置器/字段 在类 com.strease.user.strease.userInfoConstructor 上找不到 Number 的设置器/字段 在 com.strease.user.strease.userInfoConstructor 类上找不到电子邮件的设置器/字段 W/Settings:设置 plane_mode_on 已从 android.provider.Settings.System 移至 android.provider.Settings.Global,返回只读值。 I/art:做部分代码缓存收集,代码=18KB,数据=30KB I/art:代码缓存收集后,code=13KB,data=27KB 将代码缓存容量增加到 128KB V/FA:不活动,与服务断开连接 V/FA:会话开始,时间:33792791 D/FA: 记录事件 (FE): session_start(_s), Bundle[{firebase_event_origin(_o)=auto, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=-132049841330100119}] V/FA:连接到远程服务 D/FA:连接到远程服务 V/FA:处理排队服务任务:1 V/FA:不活动,与服务断开连接 V/FA:记录用户参与度,毫秒:23339 V/FA:连接到远程服务 V/FA:活动暂停,时间:33810138 D/FA: 记录事件 (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto,engagement_time_msec(_et)=23339, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=-132049841330100119}] V/FA: onActivityCreated V/FA:连接尝试已在进行中 V/FA:连接尝试已在进行中 V/FA:活动恢复,时间:33810224 D/FA: 记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=MainActivity, firebase_previous_id(_pi)=-132049841330100119, firebase_screen_class(_sc)=product_page, firebase_screen_id(_si )=-132049841330100118}] V/FA:连接尝试已在进行中 D/FA:连接到远程服务 V/FA:处理排队服务任务:4 I/art:做部分代码缓存收集,代码=42KB,数据=62KB I/art:代码缓存收集后,code=42KB,data=62KB 将代码缓存容量增加到 256KB V/FA:不活动,与服务断开连接 V/FA:记录用户参与度,毫秒:10218 V/FA:连接到远程服务 V/FA:活动暂停,时间:33820442 D/FA:记录事件 (FE):user_engagement(_e),Bundle[{firebase_event_origin(_o)=auto,engagement_time_msec(_et)=10218,firebase_screen_class(_sc)=product_page,firebase_screen_id(_si)=-132049841330100118}] V/FA: onActivityCreated I/TextInputLayout:添加的EditText 不是TextInputEditText。请改用该类。 V/FA:连接尝试已在进行中 W/AllCapsTransformationMethod:调用者未启用长度更改;不转换文本 调用者未启用长度更改;不转换文本 I/TextInputLayout:添加的EditText 不是TextInputEditText。请改用该类。 V/FA:连接尝试已在进行中 活动恢复,时间:33821178 D/FA: 记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=product_page, firebase_previous_id(_pi)=-132049841330100118, firebase_screen_class(_sc)=Checkout_page, firebase_screen_id(_si )=-132049841330100117}] V/FA:连接尝试已在进行中 D/FA:连接到远程服务 V/FA:处理排队服务任务:4 V/FA:不活动,与服务断开连接 V/FA:记录用户参与度,毫秒:18503 V/FA:连接到远程服务 V/FA:活动暂停,时间:33839680 D/FA: 记录事件 (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto,engagement_time_msec(_et)=18503, firebase_screen_class(_sc)=Checkout_page, firebase_screen_id(_si)=-132049841330100117}] V/FA:连接尝试已在进行中 连接尝试已在进行中 V/FA:活动恢复,时间:33839706 D/FA: 记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=Checkout_page, firebase_previous_id(_pi)=-132049841330100117, firebase_screen_class(_sc)=product_page, firebase_screen_id(_si )=-132049841330100118}] V/FA:连接尝试已在进行中 D/FA:连接到远程服务 V/FA:处理排队服务任务:4 V/FA:不活动,与服务断开连接

任何帮助或解释将不胜感激 谢谢。

【问题讨论】:

    标签: android firebase android-layout android-recyclerview


    【解决方案1】:

    仅对 onResume() 方法进行这些更改..

    @Override
    protected void onResume() {
    super.onResume();
    
       //FirebaseAdapter.notifyDataSetChanged();
       getData();
       }
    }
    private void getData() {
        RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2, android.support.v7.widget.StaggeredGridLayoutManager.VERTICAL);
        // RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView = (android.support.v7.widget.RecyclerView) findViewById(R.id.recyclerView1);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new android.support.v7.widget.DefaultItemAnimator());
    
        Query query = firebaseDatabase.getReference().child("Products").child(s).child(product).orderByKey();
    
        FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<ProductItemsConstructor>().setQuery(query, ProductItemsConstructor.class).build();
    
        FirebaseAdapter = new FirebaseRecyclerAdapter<ProductItemsConstructor, productViewHolder>(options) {
    
            @Override
            public productViewHolder onCreateViewHolder(android.view.ViewGroup parent, int viewType) {
                View view = android.view.LayoutInflater.from(parent.getContext()).inflate(R.layout.product_items, parent, false);
                return new productViewHolder(view);
            }
    
            @Override
            protected void onBindViewHolder(@android.support.annotation.NonNull productViewHolder holder, int position, @android.support.annotation.NonNull ProductItemsConstructor model) {
                holder.Heading(model.getHeading());
                holder.Price(model.getPrice());
                holder.Prates(model.getPprice());
                holder.Rating(model.getRating());
                holder.setImg(getApplicationContext(), model.getImageUrl());
            }
        };
        recyclerView.setAdapter(FirebaseAdapter);
        FirebaseAdapter.notifyDataSetChanged();
    }
    

    【讨论】:

    • 我试过了,还是一样,但是这一次,当活动首先启动时,recyclerView 是空的。
    【解决方案2】:

    试试这个代码:

    public class product_page extends AppCompatActivity {
    
    
    FirebaseAuth mAuth;
    String s, product;
    ProgressDialog progressDialog;
    private RecyclerView recyclerView;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference databaseReference;
    DatabaseReference db;
    FirebaseRecyclerAdapter<ProductItemsConstructor, productViewHolder> FirebaseAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_page);
    
            Intent intent = getIntent();
            s = intent.getExtras().getString("pos");
            product = intent.getExtras().getString("product");
    
        mAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = FirebaseDatabase.getInstance().getReference();
    
        RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
       // RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    
    
        Query query = firebaseDatabase.getReference().child("Products").child(s).child(product).orderByKey();
    
        FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<ProductItemsConstructor>().setQuery(query,ProductItemsConstructor.class).build();
    
        FirebaseAdapter = new FirebaseRecyclerAdapter<ProductItemsConstructor, productViewHolder>(options) {
    
    
            @Override
            public productViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_items,parent,false);
                return new productViewHolder(view);
            }
    
            @Override
            protected void onBindViewHolder(@NonNull productViewHolder holder, int position, @NonNull ProductItemsConstructor model) {
                holder.Heading(model.getHeading());
                holder.Price(model.getPrice());
                holder.Prates(model.getPprice());
                holder.Rating(model.getRating());
                holder.setImg(getApplicationContext(),model.getImageUrl());
            }
        };
        recyclerView.setAdapter(FirebaseAdapter);
    
    }
    
    
    @Override
    protected void onStart() {
        super.onStart();
    
        FirebaseAdapter.startListening();
        recyclerView.setAdapter(FirebaseAdapter);
    }
    
    @Override
    protected void onDestroy() {
        FirebaseAdapter.stopListening();
        super.onDestroy();
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
        FirebaseAdapter.notifyDataSetChanged();
    }
    
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent in = new Intent(product_page.this, MainActivity.class);
        startActivity(in);
    }
    
    public class productViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
        TextView head, rate, Prate, rating;
        ImageView img;
    
    
        public productViewHolder(final View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
        }
    
        private void Heading(String heading) {
            head = (TextView) itemView.findViewById(R.id.Pheading);
            head.setText(heading);
        }
    
        private void Price(String price) {
            rate = (TextView) itemView.findViewById(R.id.Pprice);
            rate.setText(price);
        }
    
        private void Prates(String prate){
            Prate = (TextView)itemView.findViewById(R.id.pRate);
            Prate.setText(prate);
        }
    
        private void Rating(String rting){
            rating = (TextView)itemView.findViewById(R.id.Rating);
            rating.setText(rting);
        }
    
        private void setImg(Context ctx, String img1) {
            img = (ImageView) itemView.findViewById(R.id.PImage);
            Picasso.with(ctx).load(img1).placeholder(R.drawable.notification).into(img);
            // progressDialog.dismiss();
        }
    

    【讨论】:

    • 能否请您发布日志。@JaspreetSingh
    • 我会的,但是日志中也没有错误。 @Mayur Patel
    • 日志已添加,敬请期待。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2019-08-07
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多