【问题标题】:Unable to save the fetched values from firebase database to list<String>无法将获取的值从 firebase 数据库保存到 list<String>
【发布时间】:2020-01-13 18:06:20
【问题描述】:

`

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 完成后 List 重置为零。 这就是我的 Logcat 的样子

Logcat.

我尝试制作另一个活动,然后将数据添加到列表视图,它就是这样工作的。

【问题讨论】:

  • Firebase 操作是异步。所以你必须等到完成操作才能得到结果。如果您检查您的 logcat,那么您可以看到 CountDrive CountCOUNT IN TRY 之前执行。这是因为异步行为。希望你能理解。谢谢

标签: android listview firebase-realtime-database


【解决方案1】:

要解决上述异步问题,您可以在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();
    }

}

【讨论】:

  • 哦。我现在明白了。我只添加了 driveadapter.notifyDataSetChanged() 并且它有效。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2018-07-21
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多