Android 如何从firebase数据库正确获取数据?
我正在开发一个应用程序,它可以节省用户开支,我在CustomAdapter中写道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
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()