2017-06-02 123 views
0

我是Android编程新手。我想在Android中列出Firebase中的所有子列表。在android中列出儿童

我写了这段代码。但是当我启动应用程序时,listview返回null。

什么问题?

public class haber_goruntule extends AppCompatActivity { 
private ListView liste; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_haber_goruntule); 
    final List<connector_haber> mesajlar=new ArrayList<connector_haber>(); 

    liste= (ListView) findViewById(R.id.list); 
    FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance(); 
    DatabaseReference ref=firebaseDatabase.getReference(); 

    ref.child("haberler").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
      for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
       mesajlar.add(haber); 
      } 


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
    liste.setAdapter(arrayAdapter); 
    } 
} 
+1

你好@Kevin。请确保您使用调试模式或日志语句实际接收onDataChange中的数据。另请将'arrayAdapter.notifyDataSetChanged()'调用添加为onDataChange回调中的最后一行回调 –

+0

您还可以使用子监听器https://firebase.google.com/docs/reference/android/com/google/firebase/database/ ChildEventListener这种方式你不需要迭代器,但必须添加数据到适配器每次添加 – cutiko

回答

1

数据是从Firebase异步加载的。当它回来时,你将它添加到适配器,但Android不知道这一点。为了使它意识到,打电话notifyDataSetChanged()您已经添加数据后:

final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
liste.setAdapter(arrayAdapter); 
ref.child("haberler").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
     for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
      mesajlar.add(haber); 
     } 
     adapter.notifyDataSetChanged(); // tell the adapter to update the view 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore this error 
    } 
}); 
+0

谢谢弗兰克我添加了adapter.notifyDataSetChanged()。但它仍然没有显示任何东西。我的数据库“haberler”有subchildren,它有自己的keys.Do你认为我用正确的方式列出数据库列表视图? – Kevin

+0

我很难从这里看到。但是你可以在调试器中遍历你的'onDataChange()'方法,看看'haber'是否有你期望的值。如果不是这样,你的'connector_haber'类可能与你的JSON模型不匹配(这对我来说似乎是一个单独的问题)。 –

0

以及..有与火力点实施UI开源库。试试这个FirebaseUI

+0

虽然这绝对是一种有效的方法,但构建自定义适配器也是有效的。事实上,这几乎就是FirebaseUI的开始:几年后构建自定义适配器后,我们意识到将它们放入可重用的库中可能很有用。 –

+0

Ohhooo ..男人@Frank你真棒..我见过你的个人资料!我非常感动! hatz off – MrCurious

1

试试这个:

ref.child("haberler").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Iterable<DataSnapshot> children=dataSnapshot.getChildren(); 
     for(DataSnapshot child : children){ 

      connector_haber haber=child.getValue(connector_haber.class); 
      mesajlar.add(haber); 
     } 
     final ArrayAdapter<connector_haber> arrayAdapter=new ArrayAdapter<connector_haber>(this,android.R.layout.simple_list_item_1,mesajlar); 
     liste.setAdapter(arrayAdapter); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore this error 
    } 
}); 
+0

@Kevin检查这个 –