我的代码布局是这样的,我想将从Firebase接收的数据传输到列表视图,但是我不能这样做。这可能是什么原因?我没有收到任何错误。
如何解决此问题,请帮助我。
ListView kelimelerList;
SimpleAdapter simpleAdapter;
FirebaseAuth firebaseAuth;
DatabaseReference databaseReference;
List<Kelimeler> kelimelers2;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_ogrenilenler, container, false);
kelimelerList = view.findViewById(R.id.kelimelerList);
kelimelers2 = new ArrayList<>();
firebaseAuth = FirebaseAuth.getInstance();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
databaseReference = FirebaseDatabase.getInstance().getReference(firebaseAuth.getUid()).child("Kelimeler");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
kelimelers2.add(dataSnapshot1.getValue(Kelimeler.class));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
final List<Map<String, String>> data = new ArrayList<Map<String, String>>();
for (Kelimeler kelimeler : kelimelers2){
Map<String, String> datum = new HashMap<String, String>(2);
datum.put("title", kelimeler.getKelimeIngizlice());
datum.put("data", kelimeler.getKelimeTurkce());
data.add(datum);
}
simpleAdapter = new SimpleAdapter(view.getContext(), data, android.R.layout.simple_list_item_2, new String[]{"title", "data"}, new int[]{android.R.id.text1, android.R.id.text2});
kelimelerList.setAdapter(simpleAdapter);
您的代码有两个主要问题:
数据是从Firebase异步加载的,并且您正在将该数据添加到kelimelers2
,而没有让适配器知道它。
您(同步地>>)将kelimelers2
转换为另一个数据结构,然后由您的适配器显示。
您需要解决这两个问题才能使代码开始工作。最简单的方法是将转换移到onDataChange
(修复#2),然后调用simpleAdapter.notifyDataSetChanged()
(修复#1)。
所以类似:
View view = inflater.inflate(R.layout.fragment_ogrenilenler, container, false);
kelimelerList = view.findViewById(R.id.kelimelerList);
final List<Map<String, String>> data = new ArrayList<Map<String, String>>();
firebaseAuth = FirebaseAuth.getInstance();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
databaseReference = FirebaseDatabase.getInstance().getReference(firebaseAuth.getUid()).child("Kelimeler");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
data.clear(); // clear the existing data, since we're adding everything again
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
Kelimeler kelimeler = dataSnapshot1.getValue(Kelimeler.class);
Map<String, String> datum = new HashMap<String, String>(2);
datum.put("title", kelimeler.getKelimeIngizlice());
datum.put("data", kelimeler.getKelimeTurkce());
data.add(datum);
}
simpleAdapter.notifyDataSetChanged(); // tell the adapter to render the new data
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
simpleAdapter = new SimpleAdapter(view.getContext(), data, android.R.layout.simple_list_item_2, new String[]{"title", "data"}, new int[]{android.R.id.text1, android.R.id.text2});
kelimelerList.setAdapter(simpleAdapter);