android - 查看寻呼机片段应加载 1 次以显示来自 firebase 的数据(异步任务)
问题描述
我有带有 ViewPager 的 TabLayout,它承载 3 个片段。片段 1 和 2 进展顺利,但在片段 3 中我有问题,因为我应该重新加载 1 次(打开应用程序 - 滑动到片段 3 [仍然为空] - 滑动到片段 1 - 滑动到片段 3 - 它只是显示数据)
我认为这个问题是由异步任务引起的,但我不知道如何解决这个问题。请帮助我的人。
ThreeFragment.java 包 com.example.yehezkiel.eclassapp;
public ThreeFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.fragment_three, container, false);
userRef = FirebaseDatabase.getInstance().getReference("users");
users = FirebaseAuth.getInstance().getCurrentUser();
mataKuliahRef = FirebaseDatabase.getInstance().getReference("courses");
daftarPengumumanRef = FirebaseDatabase.getInstance().getReference("pengumuman");
mAuth = FirebaseAuth.getInstance();
mRecyclerView = (RecyclerView) v.findViewById(R.id.PengumumanRView);
mRecyclerView.setHasFixedSize(true);
adapter = new PengumumanAdapter(getActivity().getApplicationContext(), consolidatedList);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(adapter);
userRef.child(users.getUid()).child("courses").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
long datacount = dataSnapshot.getChildrenCount();
int i = 0;
for(DataSnapshot dataHasil : dataSnapshot.getChildren()){
final String idCourse = dataHasil.getKey();
obj3.add(idCourse);
Log.e("obj3", obj3.toString());
queryObj3(obj3);
}
}else {
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return v;
}
public void queryObj3(final ArrayList<String> obj3){
//note ternyata stelah dilihat lewat log, semua looping sblum proses query (cth: mataKul.child().addlistener) akan di prosess terlebih dahulu... dan stelah itu baru query di looping, dan juga untuk looping ke lv query berikutnya... looping query sblumnya akan dislesaikan dulu baru mulai looping####
final ArrayList<Integer> test1 = new ArrayList<>();
final ArrayList<Integer> test2 = new ArrayList<>();
for(int j = 0 ; j<obj3.size() ;j++){
int k = 0;
mataKuliahRef.child(obj3.get(j)).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
final String name = (String) dataSnapshot.child("name").getValue();
if (dataSnapshot.hasChild("pengumuman")) {
for (DataSnapshot idKeyPeng : dataSnapshot.child("pengumuman").getChildren()) {
// listTugasKey.add(idKeyPeng.getKey());
test1.add(0); // size akan slalu bertmbah jika ada childkey pengumuman
daftarPengumumanRef.child(idKeyPeng.getKey()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot2) {
DaftarPengumuman pengumuman = new DaftarPengumuman();
pengumuman = dataSnapshot2.getValue(DaftarPengumuman.class);
pengumuman.setNama_p(name);
listPengumuman.add(pengumuman);
test2.add(0); // size akan bertmbah jika child key sudah di load
if (test1.size() == test2.size()) {
hashMap();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}//end of for
}//end of has child
else {
}
}//end of if exist
}//end of first ondatachange
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
private HashMap<String, List<DaftarPengumuman>> groupDataIntoHashMap(List<DaftarPengumuman> listOfDaftarPengumuman) {
HashMap<String, List<DaftarPengumuman>> groupedHashMap = new HashMap<>();
for (DaftarPengumuman daftarPengumuman : listOfDaftarPengumuman) {
String hashMapKey = daftarPengumuman.getNama_p();
if (groupedHashMap.containsKey(hashMapKey)) {
// The key is already in the HashMap; add the pojo object
// against the existing key.
groupedHashMap.get(hashMapKey).add(daftarPengumuman);
} else {
// The key is not there in the HashMap; create a new key-value pair
List<DaftarPengumuman> list = new ArrayList<>();
list.add(daftarPengumuman);
groupedHashMap.put(hashMapKey, list);
}
}
return groupedHashMap;
}
private void hashMap(){
HashMap<String, List<DaftarPengumuman>> groupedHashMap = groupDataIntoHashMap(listPengumuman);
for (String nama_p : groupedHashMap.keySet()) {
PengumumanItem nameItem = new PengumumanItem();
nameItem.setNama_matkul(nama_p);
consolidatedList.add(nameItem);
for (DaftarPengumuman daftarPengumuman : groupedHashMap.get(nama_p)) {
GeneralItem generalItem = new GeneralItem();
generalItem.setDaftarPengumuman(daftarPengumuman);//setBookingDataTabs(bookingDataTabs);
consolidatedList.add(generalItem);
}
}
}
}
解决方案
尝试这个
viewPager.setOffscreenPageLimit(3);
推荐阅读
- java - 使用 TestNG、Appium 和 Selenium 运行并行和顺序测试
- ruby-on-rails - ActionController::ParameterMissing(参数丢失或值为空:matatu)ruby on rails
- azure - Azure DevOps - 如何使用 TFVC 在管道任务中以编程方式创建分支
- angular - @angular/router:未检索到路由数据
- java - 服务器处理命令
- html - 未知错误:如果满足条件,则在 HTML 代码中播放音频
- javascript - OpenWeatherMap API:无法读取未定义的属性
- twilio - 您如何在 Twilio 工作室中使用两个 if_value_matches?
- c# - 统一的 2D 人造重力 (C#)
- javascript - 是否可以将 dotenv 变量存储在 json 文件中?