对于我正在创建的应用,我有一个RecyclerView,它充满了来自Firebase数据库的数据。此RecyclerView也位于Viewpager中使用的片段中。所有我能够使它工作,但我注意到的是,在第一次运行时,片段需要一段时间才能在RecyclerView中显示它的内容,所以我想将一个ProgressBar作为异步添加到它任务。
我的任务:
private class ProgressTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
mProgressLinearLayout.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
loadColleagueData();
mListener = initRealTime();
mAdapter = new CustomAdapter(mUserList, getActivity());
return null;
}
@Override
protected void onPostExecute(Void res) {
mRecyclerView.setAdapter(mAdapter);
mProgressLinearLayout.setVisibility(View.GONE);
}
}
现在这实际上有效。 ProgressBar会显示出来,并且一旦完成就会再次隐藏。但问题是,它是在如此短的时间内完成的,它是不可见的。所以我只知道它是有效的,因为调试。还需要一段时间的是RecyclerView实际显示的内容。
所以我猜我的问题是,从数据库中获取数据并不需要花费一些时间,只需将适配器设置为RecyclerView并显示内容就需要一段时间。
现在根据我的理解,是不可能在doInBackground
中设置适配器,因为你不能对主ui线程之外的视图做任何事情。所以我想知道只有在我的RecyclerView中看到内容后是否有办法隐藏ProgressBar?
(如果这是一个重复的问题,我非常抱歉,我在互联网上搜索无法帮助我)
答案 0 :(得分:0)
您应该使用FirebaseDatabase回调,不需要为此使用AsyncTask。如果您要监听单个事件,这意味着您只想下载数据,然后使用:
mProgressLinearLayout.setVisibility(View.VISIBLE);
DatabaseReference node = FirebaseDatabase.getInstance().getReference().child("your_node");
node.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
loadColleagueData();
mListener = initRealTime();
mAdapter = new CustomAdapter(mUserList, getActivity());
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mProgressLinearLayout.setVisibility(View.GONE);
如果您希望适配器始终保持最新,则可以使用addChildEventListener()或addValueEventListener()(docs here)将侦听器附加到该特定节点。或者你可以使用这个图书库,你只需要复制一个文件: