Невозможно сохранить выбранные значения из базы данных Firebase в список <String> - PullRequest
0 голосов
/ 13 января 2020

`

DatabaseReference drivedatabase ;
public static List<String> driveTitle = new ArrayList<>();
public static List<String> driveLink = new ArrayList<>() ;
ListView listView;
TextView textView;
int count = 0 ;

ArrayAdapter<String> driveadapter ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_important_stuffs);


    listView = findViewById(R.id.drivelistView);
    textView = findViewById(R.id.drivetitle);
    textView.setText("Important Stuffs");
    drivedatabase = FirebaseDatabase.getInstance().getReference("Public/IDrive");
    drivedatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                    count = (int) dataSnapshot.getChildrenCount();
                Log.i("COUNT IN TRY " , String.valueOf(count));
                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    driveTitle.add(datas.getKey());
                    driveLink.add(datas.getValue(String.class));


                }
            } catch (Exception e)
            {
                Toast.makeText(getApplicationContext(),"An error occurred Please Try Again Later",Toast.LENGTH_SHORT).show();
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    Log.i("Count",String.valueOf(count)) ;
    Log.i("Drive Count " , String.valueOf(driveTitle.size())) ;
    driveadapter = new ArrayAdapter<>(ImportantStuffs.this,android.R.layout.simple_list_item_1,driveTitle);
    listView.setAdapter(driveadapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(NetworkAvailable())
            {
                StorageClass.link = driveLink.get(position);
                Intent intent = new Intent(getApplicationContext(),ShowPdf.class);
                startActivity(intent);
            }
            else
            {
                Toast.makeText(getApplicationContext(),"Check your internet connection",Toast.LENGTH_SHORT).show();
            }
        }
    });
}

private boolean NetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}} 

Вот мой код, я получаю значения в Logcat" COUNT IN TRY ", но не после завершения ValueEvenListener. Список сбрасывается в ноль после завершения valueeventListener. Вот так выглядит мой Logcat

Logcat .

Я попытался выполнить другое действие, а затем добавить данные в просмотр списка, это работает так.

1 Ответ

0 голосов
/ 13 января 2020

Чтобы решить вышеуказанную асинхронную проблему , вы можете обновить свой адаптер внутри onDataChange, как показано ниже:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    try {
        count = (int) dataSnapshot.getChildrenCount();
        Log.i("COUNT IN TRY " , String.valueOf(count));
        for (DataSnapshot datas : dataSnapshot.getChildren()) {
            driveTitle.add(datas.getKey());
            driveLink.add(datas.getValue(String.class));
        }


        //Update your list from here
        driveadapter.notifyDataSetChanged();

    } catch (Exception e)
    {
        Toast.makeText(getApplicationContext(),"An error occurred Please Try Again Later",Toast.LENGTH_SHORT).show();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...