我无法将从Firebas接收的数据传输到列表视图

问题描述 投票:0回答:1

我的代码布局是这样的,我想将从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);
android firebase firebase-realtime-database android-listview
1个回答
0
投票

您的代码有两个主要问题:

  1. 数据是从Firebase异步加载的,并且您正在将该数据添加到kelimelers2,而没有让适配器知道它。

  2. 您(同步地>>)将kelimelers2转换为另一个数据结构,然后由您的适配器显示。

  3. 您需要解决这两个问题才能使代码开始工作。最简单的方法是将转换移到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);
© www.soinside.com 2019 - 2024. All rights reserved.