一旦RecyclerView.setAdapter完成Android

时间:2017-05-22 22:02:37

标签: android android-asynctask firebase-realtime-database android-recyclerview

对于我正在创建的应用,我有一个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?

(如果这是一个重复的问题,我非常抱歉,我在互联网上搜索无法帮助我)

1 个答案:

答案 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)将侦听器附加到该特定节点。或者你可以使用这个图书库,你只需要复制一个文件:

https://github.com/mmazzarolo/firebase-recyclerview