Firebase 在每个循环之后给出空值



我有一个类Home,其中使用方法getDatafromFirebase()从Firebase中提取数据,当我在循环中记录值时,它会显示该值,但是当我将其添加到列表中并更新适配器时,RecyclerView显示所有值的null

public class Home extends Fragment {
public Home() {}
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
private DatabaseReference reference = FirebaseDatabase.getInstance ().getReference ();
ArrayList<FirebaseVideoDetials> list;
FirebaseVideoDetials details;
RecyclerViewAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view  =inflater.inflate(R.layout.fragment_home, container, false);
RelativeLayout without = view.findViewById(R.id.withoutInternet);
RelativeLayout mainLayout = view.findViewById(R.id.mainLayout);
recyclerView = view.findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),LinearLayoutManager.HORIZONTAL));
details = new FirebaseVideoDetials();
list = new ArrayList<FirebaseVideoDetials>();
getDatafromFirebase();
adapter = new RecyclerViewAdapter(getActivity(), list);
recyclerView.setAdapter(adapter);
if(!Internetcheck.checkConnection(getActivity())){
without.setVisibility(View.VISIBLE);
mainLayout.setVisibility(View.INVISIBLE);
}else{
without.setVisibility(View.INVISIBLE);
mainLayout.setVisibility(View.VISIBLE);
}
return view;
}
public void getDatafromFirebase(){
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
DataSnapshot Videoreference = dataSnapshot.child("Videos");
for (DataSnapshot videoschild : Videoreference.getChildren()){
DataSnapshot description = videoschild.child("Description");
DataSnapshot duration = videoschild.child("Duration");
DataSnapshot title = videoschild.child("Title");
DataSnapshot thumbnail = videoschild.child("Thumbnail");
details.setDescription(String.valueOf(description.getValue()));
details.setDuration(String.valueOf(duration.getValue()));
details.setTitle(String.valueOf(title.getValue()));
details.setThumbnail(String.valueOf(thumbnail.getValue()));
Log.e("details",details.description);
list.add(details);
}
Log.e("Size",list.get(0).description);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}

要解决此问题,请移动以下代码行:

adapter = new RecyclerViewAdapter(getActivity(), list);
recyclerView.setAdapter(adapter);

在紧接之后的onDataChange()方法中:

Log.e("Size",list.get(0).description);

并注释以下代码行,因为不需要:

//adapter.notifyDataSetChanged();

为了使它工作,您必须在回调中初始化并设置适配器,否则由于此方法的异步行为,它将始终null。为此,我建议您从这篇文章中看到我的答案。您也可以观看此视频以更好地了解。

在调用适配器之前,必须先初始化适配器。notifyDataSetChanged

adapter = new RecyclerViewAdapter(getActivity(), list);
getDatafromFirebase();

我通过在单独的函数中调用Listview的add函数来解决它:

public void getDatafromFirebase(){
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
list.clear();
DataSnapshot Videoreference = dataSnapshot.child("Videos");
for (DataSnapshot videoschild : Videoreference.getChildren()){
DataSnapshot description = videoschild.child("Description");
DataSnapshot duration = videoschild.child("Duration");
DataSnapshot title = videoschild.child("Title");
DataSnapshot thumbnail = videoschild.child("Thumbnail");
DataSnapshot date = videoschild.child("Date");
DataSnapshot time = videoschild.child("Time");
updatelist(description.getValue(String.class),
title.getValue(String.class),
String.valueOf(duration.getValue()),
thumbnail.getValue(String.class),
String.valueOf(date.getValue()),
String.valueOf(time.getValue()));
}
adapter.notifyDataSetChanged();
progressbar.setVisibility(View.GONE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
public void updatelist(String desc,String title,String duration,String thumbnail,String Date,String time){
FirebaseVideoDetials details = new FirebaseVideoDetials();
details.setDescription(desc);
details.setDuration(duration);
details.setTitle(title);
details.setThumbnail(thumbnail);
details.setTime(time);
details.setDate(Date);
list.add(details);
}

最新更新