Recylerview不会自动从Firebase Android Studio加载数据 [英] Recylerview not automatically loading data from firebase Android Studio

查看:174
本文介绍了Recylerview不会自动从Firebase Android Studio加载数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试了一切,但是当我打开应用程序时,并没有自动加载firebase中的数据,我必须点击一个edittext来加载数据。



I已尝试

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

请有人可以帮我一下。



编辑:



我保存到firebase像这样:

  public FirebaseHelper(DatabaseReference db){
this.db = db;

//写入如果不是NULL
公共布尔值保存(Spacecraft spacecraft)
{
if(spacecraft == null)
{
saved = false;
} else
{
try
{
db.child(Spacecraft)。push()。setValue(spacecraft);
saved = true;
} catch(DatabaseException e)
{
e.printStackTrace();
saved = false;
}
}
返回保存;

//执行获取数据和填充数组
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.c​​lear(); (DataSnapshot ds:dataSnapshot.getChildren())
{
Spacecraft spacecraft = ds.getValue(Spacecraft.class);
spacecrafts.add(航天器);
}
}
//读取返回值列表
public ArrayList< Spacecraft> (){
db.addChildEventListener(new ChildEventListener(){
@Override $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){
fetchData(dataSnapshot);

@Override
public void onChildChanged(DataSnapshot dataSnapshot,String s){
$ b fetchData(dataSnapshot);
}
});
返回航天器;


$ / code $ / pre
$ b $我的viewholder类

  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());



$ b我的适配器类

  public class MyAdapter extends RecyclerView.Adapter< MyViewHolder> {
上下文c;
ArrayList< Spacecraft>航天器;
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,假);
返回新的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();

//打开详细信息活动
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);





$ b

我在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);


解决方案

修改helper构造器是这样的: >

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





$ b

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

如果(spacecrafts.size()> 0)
{
adapter = new CustomAdapter(c,spacecrafts);

  
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();

$ / code>

然后在主要活动中像这样修改它:

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

这应该适合您。


I have tried everything but my data from firebase is not getting loaded automatically when I open the app and I have to click a edittext to load the data.

I have tried

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

Please can someone help me out.

EDITED:

I am saving to firebase like this:

    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;
    }
}

My viewholder class

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());
    }

My adapter class

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);
    }

in my mainactivity in onCreate I am calling the data like this

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);

解决方案

modify the helper constructer to be like this:

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

then add this to the fetchData method after the for loop:

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

then in the main activity modify it like this:

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

this should work for you.

这篇关于Recylerview不会自动从Firebase Android Studio加载数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆