RecyclerView 需要时间在 Fragment 中加载 Adapter 值

RecyclerView takes time loading Adapter values in a Fragment

我有一个带有 RecyclerView 的片段 (HealFragment),它的适配器是不同的 class 借助 FirestoreRecyclerAdapter 从 Firestore 检索数据并且它运​​行良好。但是每当我切换到这个 HealFragment 时,它都会在尝试 将适配器设置为 RecyclerView 时有点卡顿(变慢)。发生这种情况是因为我在 onStart() 方法中设置了 RecyclerView 的适配器。

So my question is, how do I avoid this stuttering when the Fragment is loading the Firestore data with the Adapter class?

How can I open the Fragment without stutters just with a ProgressBar and let the app get the Adapter data at it's own pace?

我考虑过对 HealFragment 实施 AsyncTask class,但听说 Firestore 已经是异步的了。

您可能会在 HealFragment 的 onStart() 方法中看到我的临时解决方案 class 是在将适配器附加到 RecyclerView 之前添加 0.5 秒的延迟(处理程序)。但我希望能有更完整的方法。

上下文:


    public class HealFragment extends Fragment {
      private View mView;
      private ProgressBar heFrProgressBar;
      private RecyclerView heFrRecyclerView;

      private HealAdapter healAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mView = inflater.inflate(R.layout.fragment_heal, container, false);

        initializeViews();

        return mView;
    }

    //<--- Method to initialize and assign the views | Called in: onCreateView() --->
    private void initializeViews() {

        //Loading Firestore Data Process
        final String mCurrentUser = mAuth.getCurrentUser().getUid();
        Query query = db.collection("User").document(currentUser).collection("Heals").orderBy("healColor");
        FirestoreRecyclerOptions options = new FirestoreRecyclerOptions.Builder<NewHeal>()
                .setQuery(query, NewHeal.class)
                .build();

        healAdapter = new HealAdapter(options);
        heFrRecyclerView.setHasFixedSize(true);
        heFrRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        heFrRecyclerView.setAdapter(healAdapter);

    }

    @Override
    public void onStart() {
        super.onStart();

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                //** Actions to do after 0.5 second **
                healAdapter.startListening();
                heFrProgressBar.setVisibility(View.INVISIBLE);
            }
        }, 500);
    }

    @Override
    public void onStop() {
        super.onStop();

        healAdapter.stopListening();
    }
}
public class HealAdapter extends FirestoreRecyclerAdapter<NewHeal, HealAdapter.HealHolder> {

    public HealAdapter(@NonNull FirestoreRecyclerOptions<NewHeal> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull final HealHolder holder, final int position, @NonNull final NewHeal model) {
        holder.setTaskTitle(model.getTaskTitle());
        //**Several setters like the one above**

    }

    @NonNull
    @Override
    public HealHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_heal, parent, false);
        return new HealHolder(v);
    }

    class HealHolder extends RecyclerView.ViewHolder {

        //**Declaring Variables**

        HealHolder(@NonNull View itemView) {
            super(itemView);
            this.mView = itemView;

            //**initializingViews + settingOnClickListeners + loadingSomeMethods**
        }

        private void setTaskTitle(String xTitle) {
            singleHealTitleText.setText(xTitle);
        }

        //**Several setter methods more like the one above(setTaskTitle)**
    }

}

不需要 AsyncTask,已弃用,正如您所说的 Firebase 是异步的。

你应该做的是制作一个界面,在进行抓取过程时通知你,然后显示一个 progressBar,直到你有要显示的数据。

您可以将侦听器附加到查询以了解它何时完成,并在获取数据之前显示 progressBar

您可以将侦听器附加到查询对象,一旦获取数据,您就可以隐藏 progressBar

query.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
         // data has been fetched, hide progress and update adapter data
          heFrProgressBar.setVisibility(View.GONE);
         // set the new data to the adapter
         healAdapter.notifyDataSetChanged();
    }
});





@Override
    public void onStart() {
        super.onStart();
       healAdapter.startListening();
    }

您不需要使用具有延迟的处理程序,这被认为是一种不好的做法,您需要做的是将一个侦听器附加到您的异步查询中,一旦获取了数据,您需要隐藏progressBar,更新适配器中的数据并通知数据已更改