2017-04-19 132 views
0

我开发的应用程序,保持用户的开支,我写CustomAdapter如何从Firebase数据库正确获取数据?

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

,并在活动中实现

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




} 

,但连我都保存在火力返回null和传递空到田地的一些数据(textview),但是当我添加新项目时,它会显示Firebase中的现有数据。我的一位朋友说,我正在异步调用数据,但我不明白这一点。我想要在活动打开时直接显示数据。任何帮助表示赞赏,感谢

当我打开活动:

enter image description here

我添加新的数据后:

enter image description here

回答

0
myRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      fetchdata(); 
      } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

这将获取相应的数据

+0

不幸的是它仍然表现相同。 –

0

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

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

的getExpenses()方法执行异步操作

尝试直接传递代替列表和调用getExpenses方法以及

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

然后,当notifyDatasetChanged被称为在fetchData方法它会更新列表。

相关问题