Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从firebase数据库正确获取数据?_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 如何从firebase数据库正确获取数据?

Android 如何从firebase数据库正确获取数据?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在开发一个应用程序,它可以节省用户开支,我在CustomAdapter中写道 public class CustomAdapter extends BaseAdapter{ Context c; ArrayList<Income> incomes; public CustomAdapter(){} public CustomAdapter(Context c,ArrayList<Income> incomes){ this.incomes=income

我正在开发一个应用程序,它可以节省用户开支,我在CustomAdapter中写道

public class CustomAdapter extends BaseAdapter{
Context c;
ArrayList<Income> incomes;



public CustomAdapter(){}

public CustomAdapter(Context c,ArrayList<Income> incomes){
    this.incomes=incomes;
    this.c=c;


}

@Override
public int getCount() {
    return incomes.size();
}

@Override
public Object getItem(int position) {
    return incomes.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView==null){
        convertView= LayoutInflater.from(c).inflate(R.layout.model,parent,false);
    }

    TextView nameTxt= (TextView) convertView.findViewById(R.id.nameTxt);
    TextView propTxt= (TextView) convertView.findViewById(R.id.aciklama);
    TextView descTxt= (TextView) convertView.findViewById(R.id.descTxt);



     Income s= (Income) this.getItem(position);
    nameTxt.setText(s.getName());
    propTxt.setText(s.getType());
    descTxt.setText((String.valueOf(s.getMiktar())));

    return convertView;
}
公共类CustomAdapter扩展了BaseAdapter{
上下文c;
ArrayList收入;
公共CustomAdapter(){}
公共CustomAdapter(上下文c、ArrayList){
这.收入=收入;
这个.c=c;
}
@凌驾
public int getCount(){
收益率。大小();
}
@凌驾
公共对象getItem(int位置){
回报收入。获得(职位);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=LayoutFlater.from(c).充气(R.layout.model,父项,false);
}
TextView nameTxt=(TextView)convertView.findViewById(R.id.nameTxt);
TextView propTxt=(TextView)convertView.findViewById(R.id.aciklama);
TextView descTxt=(TextView)convertView.findViewById(R.id.descTxt);
收入s=(收入)此.getItem(位置);
nameTxt.setText(s.getName());
setText(s.getType());
descTxt.setText((String.valueOf(s.getMiktar()));
返回视图;
}
并在活动中实施

public class ExpenseActivity extends Activity{

DatabaseReference db;

FloatingActionButton fab;
ExpenseAdapter adapter;
ListView lv;
Boolean saved;
EditText nameEditTxt, propTxt, descTxt;
ArrayList<Expense> expenselist = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.expense_content);

    //Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
    // setSupportActionBar(toolbar);
    lv = (ListView) findViewById(R.id.listview);

    db = FirebaseDatabase.getInstance().getReference();
    //isa



    adapter = new ExpenseAdapter(ExpenseActivity.this, getExpenses());
    lv.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            displayInput();
        }
    });


}

public Boolean save(Expense expense){

    if(expense==null){

        saved=false;

    }else{

        try{


            db.child("Expense").push().setValue(expense);

            saved=true;
        }catch (Exception ex){

            ex.printStackTrace();;
            saved=false;

        }
    }

    return saved;


}



public void fetchData(DataSnapshot dataSnapshot)
{



    expenselist.clear();


    for (DataSnapshot ds : dataSnapshot.getChildren())
    {
        Expense expense=ds.getValue(Expense.class);
        expenselist.add(expense);
        adapter.notifyDataSetChanged();

    }

}




public ArrayList<Expense> getExpenses(){

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

}






private void displayInput() {
    final Dialog d=new Dialog(this);

    d.setTitle("Gelir Girin");

    d.setContentView(R.layout.expense_layout);

    nameEditTxt = (EditText) d.findViewById(R.id.name);
    propTxt = (EditText) d.findViewById(R.id.kategori);
    descTxt = (EditText) d.findViewById(R.id.miktar);
    Button saveBtn = (Button) d.findViewById(R.id.saveBtn);


    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = nameEditTxt.getText().toString();
            String type = propTxt.getText().toString();
            String  amount= String.valueOf(descTxt.getText().toString());

            Expense expense=new Expense(name,type,amount);




            if (name != null && name.length() > 0) {
                //THEN SAVE
                if (save(expense)) {


                    //IF SAVED CLEAR EDITXT
                    d.cancel();
                    nameEditTxt.setText("");
                    propTxt.setText("");
                    descTxt.setText("");


                }
            } else {
                Toast.makeText(ExpenseActivity.this, "Name Must Not Be Empty", Toast.LENGTH_SHORT).show();
            }

        }
    });

    d.show();




}
公共类支出活动扩展活动{
数据库参考数据库;
浮动操作按钮;
费用适配器;
ListView lv;
布尔保存;
EditText名称editTXT、propTxt、descTxt;
ArrayList ExpensList=新建ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.expense\u content);
//Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
//设置支持操作栏(工具栏);
lv=(ListView)findViewById(R.id.ListView);
db=FirebaseDatabase.getInstance().getReference();
//伊萨
adapter=新的ExpenseAdapter(ExpenseActivity.this,getExpenses());
低压设置适配器(适配器);
adapter.notifyDataSetChanged();
fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
显示输入();
}
});
}
公共布尔存储(费用){
如果(费用==null){
保存=假;
}否则{
试一试{
db.child(“费用”).push().setValue(费用);
保存=真;
}捕获(例外情况除外){
例如printStackTrace();;
保存=假;
}
}
保存的返回;
}
公共void fetchData(DataSnapshot DataSnapshot)
{
expenselist.clear();
对于(DataSnapshot ds:DataSnapshot.getChildren())
{
Expense Expense=ds.getValue(Expense.class);
费用列表。添加(费用);
adapter.notifyDataSetChanged();
}
}
公共阵列列表getExpenses(){
db.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
获取数据(dataSnapshot);
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
获取数据(dataSnapshot);
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
返回expenselist;
}
私有void displayInput(){
最终对话框d=新对话框(本);
d、 片名(“Gelir Girin”);
d、 setContentView(R.layout.expense_布局);
nameEditTxt=(EditText)d.findViewById(R.id.name);
propTxt=(EditText)d.findViewById(R.id.kategori);
descTxt=(EditText)d.findViewById(R.id.miktar);
按钮saveBtn=(按钮)d.findviewbyd(R.id.saveBtn);
saveBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串名称=nameEditTxt.getText().toString();
字符串类型=propTxt.getText().toString();
字符串金额=String.valueOf(descTxt.getText().toString());
费用=新费用(名称、类型、金额);
if(name!=null&&name.length()>0){
//然后保存
如果(节省(费用)){
//如果保存,请清除EDITXT
d、 取消();
nameEditTxt.setText(“”);
propTxt.setText(“”);
descTxt.setText(“”);
}
}否则{
Toast.makeText(ExpenseActivity.this,“名称不得为空”,Toast.LENGTH_SHORT.show();
}
}
});
d、 show();
}
但即使我在firebase中保存了一些数据,它也会返回null并将null传递给字段(textview)起初,但当我添加新项目时,它会显示Firebase中的现有数据。我的一位朋友说,我正在同步调用数据,但我不明白。我希望在活动打开时直接显示数据。感谢任何帮助,谢谢

当我打开“活动”时:

添加新数据后:


这将获取适当的数据

您的问题是,在从数据库获取数据之前,您正在初始化适配器

adapter = new ExpenseAdapter(ExpenseActivity.this, getExpenses());
getExpenses()方法正在执行异步操作

尝试直接传递列表,并调用getExpenses方法

adapter = new ExpenseAdapter(ExpenseActivity.this, expenselist);
getExpenses()

然后,当在fetchData方法中调用notifyDatasetChanged时,它将更新列表。

不幸的是,它的行为仍然相同。
adapter = new ExpenseAdapter(ExpenseActivity.this, expenselist);
getExpenses()