首页 > 解决方案 > 数据未从 Firebase 数据库加载到 RecyclerView

问题描述

这是 Firebase JSON 的图像

我正在使用 Firebase 数据库 + FirebaseUI 将某些数据从 Firebase 加载到 Android,但数据未显示在回收站视图中。

但是,通过记录 getCount(),我可以看到返回了“2”,这意味着存在数据,但在 recyclerView 中不可见。

这是我的模型类:

public SlideshowModel(){

}

public SlideshowModel(String title, String desc, String image, String date) {
    this.title = title;
    this.desc = desc;
    this.image = image;
    this.date = date;
}

public String getTitle() {
    return title;
}

public String getDesc() {
    return desc;
}

public String getImage() {
    return image;
}

public String getDate() {
    return date;
}
}

这是我的适配器类:

public class SlideShowAdapter extends FirebaseRecyclerAdapter<SlideshowModel, SlideShowAdapter.ViewHolder> {


public SlideShowAdapter(@NonNull FirebaseRecyclerOptions<SlideshowModel> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull ViewHolder holder, final int position, @NonNull SlideshowModel model) {

    Picasso.get().load(R.drawable.notification).fit().centerCrop().placeholder(R.drawable.placeholders).into(holder.image);
    holder.title.setText(model.getTitle());
    holder.description.setText(model.getDesc());
    holder.date.setText(model.getDate());

    holder.delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FirebaseDatabase.getInstance().getReference("notifications").child(getRef(position).getKey()).removeValue();


        }
    });

}

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

class ViewHolder extends RecyclerView.ViewHolder {

    ImageView image, notif_icon, share_image, download_image, delete;
    TextView title, description, date;


    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        image = itemView.findViewById(R.id.notif);
        title = itemView.findViewById(R.id.title);
        description = itemView.findViewById(R.id.description);
        date = itemView.findViewById(R.id.date);
        delete = itemView.findViewById(R.id.delete_notif);

这是我的活动:

     List<SlideshowModel> slideshowModelList;
    SlideShowAdapter adapter;

    ProgressDialog pd;
    RecyclerView recycler_view;
    AdView adView;
    DatabaseReference dbProducts;

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

        recycler_view = findViewById(R.id.recycler_view);
        pd = new ProgressDialog(this);
        recycler_view.setHasFixedSize(true);
        setTitle("Show Notifications");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        slideshowModelList = new ArrayList<>();
         dbProducts = FirebaseDatabase.getInstance().getReference("notifications");

//        adView = findViewById(R.id.adView);
//        MobileAds.initialize(this,"ca-app-pub-3940256099942544~3347511713");
//        AdRequest adRequest = new AdRequest.Builder().build();
//        adView.loadAd(adRequest);


        if (isNetworkConnected()) {
            pd.setMessage("Loading");
            pd.setCanceledOnTouchOutside(false);
            pd.show();

            final DatabaseReference dbProducts = FirebaseDatabase.getInstance().getReference("notifications");
            Log.e("path1", dbProducts.toString());


            dbProducts.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
//
                }

                @Override
                public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
//                    Toast.makeText(ShowNotifActivity.this, "Child Changed", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });




            dbProducts.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists() || !slideshowModelList.isEmpty()) {


                        for (DataSnapshot productSnapshot : dataSnapshot.getChildren()) {
                            SlideshowModel p = productSnapshot.getValue(SlideshowModel.class);
                            slideshowModelList.add(p);
                        }


                        FirebaseRecyclerOptions<SlideshowModel> options =
                                new FirebaseRecyclerOptions.Builder<SlideshowModel>()
                                        .setQuery(FirebaseDatabase.getInstance().getReference().child("notifications"), SlideshowModel.class)
                                        .build();

                        adapter = new SlideShowAdapter(options);
                        recycler_view.setAdapter(adapter);


//                        adapter = new SlideShowAdapter(SlideshowModel)

                        String current_counts = String.valueOf(dataSnapshot.getChildrenCount());

                        Log.e("Curr_Count : ", current_counts);


                        Collections.reverse(slideshowModelList);
                        recycler_view.setAdapter(adapter);

                        // lovelyProgressDialog.dismiss();
                        pd.dismiss();

                    }
                    else {
                        Toast.makeText(ShowNotifActivity.this, "No Notifications Available", Toast.LENGTH_SHORT).show();
                        pd.dismiss();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(getApplicationContext(), "Some Error Occured", Toast.LENGTH_SHORT).show();
                    pd.dismiss();

                }
            });

        } else {
            pd.dismiss();
            new AlertDialog.Builder(getApplicationContext())
                    .setTitle("No Internet Available")
                    .setMessage("Please connect to Internet to get the Notifications")


                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {


                        }
                    }).show();


        }


        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        recycler_view.setLayoutManager(linearLayoutManager); // set LayoutManager to RecyclerView


    }

更新

我在 AdapterClass 中初始化了构造函数,但仍然没有运气。

标签: androidfirebase-realtime-database

解决方案


每次将数据设置到适配器时,您都需要调用

notifyDataSetChanged()

刷新适配器的数据。有用的链接


推荐阅读