【问题标题】:Recylerview not automatically loading data from firebase Android StudioRecyclerview 不会自动从 Firebase Android Studio 加载数据
【发布时间】:2017-06-12 04:26:15
【问题描述】:

我已经尝试了所有方法,但是当我打开应用程序时,我的来自 firebase 的数据没有自动加载,我必须单击编辑文本来加载数据。

我试过了

  adapter.Update(data);
  recycler.invalidate();
  notifyDataSetChanged();
  adapter.notifyDataSetChanged();

请有人帮帮我。

已编辑:

我正在像这样保存到 firebase:

    public FirebaseHelper(DatabaseReference db) {
        this.db = db;
    }
    //WRITE IF NOT NULL
    public Boolean save(Spacecraft spacecraft)
    {
        if(spacecraft==null)
        {
            saved=false;
        }else
        {
            try
            {
                db.child("Spacecraft").push().setValue(spacecraft);
                saved=true;
            }catch (DatabaseException e)
            {
                e.printStackTrace();
                saved=false;
            }
        }
        return saved;
    }
    //IMPLEMENT FETCH DATA AND FILL ARRAYLIST
    private void fetchData(DataSnapshot dataSnapshot)
    {
        spacecrafts.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren())
        {
            Spacecraft spacecraft=ds.getValue(Spacecraft.class);
            spacecrafts.add(spacecraft);
        }
    }
    //READ THEN RETURN ARRAYLIST
    public ArrayList<Spacecraft> retrieve() {
        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s){

                fetchData(dataSnapshot);
            }
        });
        return spacecrafts;
    }
}

我的视图类

public MyViewHolder(View itemView) {
        super(itemView);
        nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
        propTxt= (TextView) itemView.findViewById(R.id.propellantTxt);
        descTxt= (TextView) itemView.findViewById(R.id.descTxt);
        itemView.setOnClickListener(this);
    }
    public void setItemClickListener(ItemClickListener itemClickListener)
    {
        this.itemClickListener=itemClickListener;
    }
    @Override
    public void onClick(View view) {
        this.itemClickListener.onItemClick(this.getLayoutPosition());
    }

我的适配器类

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    Context c;
    ArrayList<Spacecraft> spacecrafts;
    public MyAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
        this.c = c;
        this.spacecrafts = spacecrafts;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v=LayoutInflater.from(c).inflate(R.layout.model,parent,false);
        return new MyViewHolder(v);
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        final  Spacecraft s=spacecrafts.get(position);
        holder.nameTxt.setText(s.getName());
        holder.propTxt.setText(s.getPropellant());
        holder.descTxt.setText(s.getDescription());
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(int pos) {
                //OPEN DETAI ACTIVITY
                openDetailActivity(s.getName(),s.getDescription(),s.getPropellant());
            }
        });
    }
    @Override
    public int getItemCount() {
        return spacecrafts.size();
    }
    //OPEN DETAIL ACTIVITY
    private void openDetailActivity(String...details)
    {
        Intent i=new Intent(c,DetailActivity.class);
        i.putExtra("NAME_KEY",details[0]);
        i.putExtra("DESC_KEY",details[1]);
        i.putExtra("PROP_KEY",details[2]);
        c.startActivity(i);
    }

在 onCreate 的主要活动中,我正在调用这样的数据

recycler = (RecyclerView) rootView.findViewById(R.id.recycler);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
database = FirebaseDatabase.getInstance().getReference();
spacecraft = new ArrayList<>();
firebasehelper = new FirebaseHelper(database);
adapter = new JAdapter(getActivity(), firebasehelper.retrieve());
recycler.setAdapter(adapter);

【问题讨论】:

  • 贴出你获取数据的观察者代码
  • 嗨,我已将链接粘贴到我观看的阅读 Firebase 数据的教程中。如果您希望我将代码粘贴到此处,请告诉我。我写了完全相同的代码。
  • 发布您的代码和视频。不是从你学到的地方
  • 请看更新

标签: android android-studio firebase android-recyclerview firebase-realtime-database


【解决方案1】:

检查你是否在 onCreate() 方法中设置了适配器,如果你在 onStart() 中调用它,那么它不会自动加载数据。在 onCreate() 方法中设置 Adapter。

【讨论】:

    【解决方案2】:

    修改辅助构造函数如下:

     public FirebaseHelper(Context c, DatabaseReference db, ListView lv) {
        this.c = c;
        this.db = db;
        this.lv = lv;
    }
    

    然后将其添加到 for 循环之后的 fetchData 方法中:

    if (spacecrafts.size() > 0)
        {
            adapter = new CustomAdapter(c, spacecrafts);
            lv.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    

    然后在主活动中修改如下:

        helper = new FirebaseHelper(this, db, lv);
        //ADAPTER
        //adapter = new CustomAdapter(this, helper.retrieve());
        //lv.setAdapter(adapter);
        helper.retrieve();
    

    这应该适合你。

    【讨论】:

      【解决方案3】:

      使用 FirebaseRecyclerAdapter 从 Firebase 加载数据。

      【讨论】:

        【解决方案4】:

        问题在于retrieve 方法:它添加了一个异步执行ChildEventListener(这意味着它在获取子数据之前不会阻塞),然后它立即返回@ 987654323@ 列表仍未被异步侦听器代码填充。

        您应该在获取数据的实际代码中刷新RecyclerView 适配器,即在fetchData 方法中,例如:

        private void fetchData(DataSnapshot dataSnapshot)
        {
            spacecrafts.clear();
            for (DataSnapshot ds : dataSnapshot.getChildren())
            {
                Spacecraft spacecraft=ds.getValue(Spacecraft.class);
                spacecrafts.add(spacecraft);
            }
            adapter.spacecrafts = spacecrafts; // update the list in the adapter
            adapter.notifyDataSetChanged(); // refresh
        }
        

        在这种情况下,retrieve 方法可以有一个void 返回类型,因为从它返回列表是没有意义的。

        【讨论】:

        • 它不在 fetchData 中重新委托适配器
        • @JoshJoe 我不打算完全照原样复制我的 sn-p。这个想法是你应该找到从FirebaseHelper 调用适配器的方法。您可以在构造函数中传递适配器,也可以将回调接口传递给retrieve 方法,并在获取所有子项完成时调用此回调。
        • 我一直在玩,但我似乎无法让它工作
        • 无论我如何将 adpater 放在那里,应用程序都会崩溃
        猜你喜欢
        • 2017-06-14
        • 2018-04-06
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2021-09-01
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多