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
,更新适配器中的数据并通知数据已更改
我有一个带有 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
,更新适配器中的数据并通知数据已更改