2017-07-24 31 views
1

在FirebaseHelper类中,我声明检索ArrayList方法以返回spacecrafts ArrayList,它调用fetchData方法在spacecrafts中添加新Item,在MainActivity中,我使用helper.retrieve在onCreate方法中填充适配器,并使对话框添加用户物品时,点击saveBtn巫婆填充我的适配器与helper.retrieve也适配器是什么都没有填充,我做吐司检测问题,发现spacecrafts.size填充每次与新项目,但助手。检索()。size每次= 0,任何人都可以显示我的错误吗?在Firebase calss适配器中填充没有任何信息

这里是FirebaseHelper类:

class FirebaseHelper { 
private DatabaseReference db; 
private ArrayList<Spacecraft> spacecrafts=new ArrayList<>(); 
int x; 

public FirebaseHelper(DatabaseReference db) { 
    this.db = db; 
} 
public Boolean save(Spacecraft spacecraft) 
{ 
    Boolean saved ; 
    if(spacecraft==null) 
    { 
     saved =false; 
    }else 
    { 
    try 
     { 
      db.child("Spacecraft").push().setValue(spacecraft); 
      saved =true; 
     }catch (DatabaseException e) 
     { 
      e.printStackTrace(); 
      saved =false; 
     } 
    } 
    return saved; 
} 
private void fetchData(DataSnapshot dataSnapshot) 
{ 
    spacecrafts.clear(); 
    for (DataSnapshot ds : dataSnapshot.getChildren()) 
    { 
     Spacecraft spacecraft=ds.getValue(Spacecraft.class); 
     spacecrafts.add(spacecraft); 
     x=spacecrafts.size(); 
    } 
} 

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); 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
     } 
     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
    return spacecrafts; 
} 
} 

,这里是主要活动类:

public class MainActivity extends AppCompatActivity { 
    DatabaseReference db; 
    FirebaseHelper helper; 
    MyAdapter adapter; 
    private RecyclerView rv; 
    EditText nameEditTxt,propTxt,descTxt; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.content_main); 

    rv= (RecyclerView) findViewById(R.id.rv); 
    rv.setLayoutManager(new LinearLayoutManager(this)); 

    db= FirebaseDatabase.getInstance().getReference(); 
    helper=new FirebaseHelper(db); 

    adapter=new MyAdapter(this,helper.retrieve()); 
    rv.setAdapter(adapter); 
    Toast.makeText(MainActivity.this, "helper.retrieve().size() = " + helper.retrieve().size(), Toast.LENGTH_SHORT).show(); 
    Toast.makeText(MainActivity.this, "spacecrafts.size() = " + helper.x, Toast.LENGTH_SHORT).show(); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      displayInputDialog(); 
      Toast.makeText(MainActivity.this, "spacecrafts.size() = " + helper.x, Toast.LENGTH_SHORT).show(); 
      Toast.makeText(MainActivity.this, "helper.retrieve().size() = " + helper.retrieve().size(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

private void displayInputDialog() 
{ 
    final Dialog d=new Dialog(this); 
    d.setTitle("Save To Firebase"); 
    d.setContentView(R.layout.input_dialog); 
    nameEditTxt= (EditText) d.findViewById(R.id.nameEditText); 
    propTxt= (EditText) d.findViewById(R.id.propellantEditText); 
    descTxt= (EditText) d.findViewById(R.id.descEditText); 
    Button saveBtn= (Button) d.findViewById(R.id.saveBtn); 

    saveBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //GET DATA 
      String name=nameEditTxt.getText().toString(); 
      String propellant=propTxt.getText().toString(); 
      String desc=descTxt.getText().toString(); 
      //SET DATA 
      Spacecraft s=new Spacecraft(); 
      s.setName(name); 
      s.setPropellant(propellant); 
      s.setDescription(desc); 

      if(name.length() > 0) 
      { 
       if(helper.save(s)) 
       { 
        nameEditTxt.setText(""); 
        propTxt.setText(""); 
        descTxt.setText(""); 
        adapter=new MyAdapter(MainActivity.this,helper.retrieve());    
        Toast.makeText(MainActivity.this, "spacecrafts.size() = " + helper.x, Toast.LENGTH_SHORT).show(); 
        Toast.makeText(MainActivity.this, "helper.retrieve().size() = " + helper.retrieve().size(), Toast.LENGTH_SHORT).show(); 
        rv.setAdapter(adapter); 
        adapter.notifyDataSetChanged(); 
        d.hide(); 
       } 
      }else 
      { 
       Toast.makeText(MainActivity.this, "Name Must Not Be Empty", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    d.show(); 
} 
} 
+0

ü可以分享你的火力点数据结构的工作? –

+0

这里是:https://ibb.co/e35Z75 –

回答

0

我尝试这和它的

 private void fetchData(DataSnapshot dataSnapshot) 
    { 
    // spacecrafts.clear(); 
    for (DataSnapshot ds : dataSnapshot.getChildren()) 
    { 
     Spacecraft spacecraft=ds.getValue(Spacecraft.class); 
     spacecrafts.add(spacecraft); 
     x=spacecrafts.size(); 
    } 
    } 

ArrayList<Spacecraft> retrieve() 
{ 
    db.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      // try to clear spacecrafts here 
      spacecrafts.clear(); 
      fetchData(dataSnapshot); 
     } 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
      // and here 
      spacecrafts.clear(); 
      fetchData(dataSnapshot); 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
     } 
     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
    return spacecrafts; 

    } 
    } 
0

火力地堡操作异步运行,这意味着他们是在一个单独的线程上运行,所以你的方法ArrayList<Spacecraft> retrieve()回报在它被填充之前的列表。

+0

我该如何解决这个问题?我在回来之前叫fetchData女巫填补航天器! –