Я не могу передать данные, полученные от Firebas, в просмотр списка - PullRequest
0 голосов
/ 01 марта 2020

Мой код выглядит следующим образом, я хочу перенести данные, полученные из 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);

1 Ответ

0 голосов
/ 01 марта 2020

У вашего кода две основные проблемы:

  1. Данные загружаются из Firebase асинхронно, и вы добавляете эти данные в kelimelers2, не сообщая об этом адаптеру.

  2. Вы ( синхронно ) конвертируете kelimelers2 в другую структуру данных, которую затем отображает ваш адаптер.

You Нужно исправить обе проблемы, чтобы код начал работать. Самый простой способ - перевести преобразование в 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);
...