有没有办法根据firebase数据库中的子项数量动态更改Android中的选项卡数量?
我必须创建一个具有选项卡数量的项目,该数量是根据firebase数据库中的子级数量决定的 我需要的标签数量减少和增加,如果一个新的孩子被删除或添加到数据库分别 我已成功获取Firebase数据库中的子级数,但无法将其传递给决定选项卡数的函数(有没有办法根据firebase数据库中的子项数量动态更改Android中的选项卡数量?,android,firebase,firebase-realtime-database,tabs,Android,Firebase,Firebase Realtime Database,Tabs,我必须创建一个具有选项卡数量的项目,该数量是根据firebase数据库中的子级数量决定的 我需要的标签数量减少和增加,如果一个新的孩子被删除或添加到数据库分别 我已成功获取Firebase数据库中的子级数,但无法将其传递给决定选项卡数的函数(getcount()) 从中检索Firebase数据的类: import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import andro
getcount()
)
从中检索Firebase数据的类:
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
/**
* A simple {@link Fragment} subclass.
*/
public class CommunitiesFragment extends Fragment {
private static int commonVariable;
private DatabaseReference mDatabaseReference;
public CommunitiesFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v=inflater.inflate(R.layout.community_tab, container, false);
mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("COMMUNITIES");
Log.e("TESTApp", "The value is checked");
mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
commonVariable = (int) dataSnapshot.getChildrenCount();
Log.e("COMMON-VALUE", commonVariable + "");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return v;
}
static int tabNumber(){
int a = CommunitiesFragment.commonVariable;
Log.e("Tab Function Value:",a+"");
return a;
}
}
负责创建选项卡的选项卡适配器类:
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
public class CommunityAdapter extends FragmentStatePagerAdapter {
public CommunityAdapter(@NonNull FragmentManager fm) {
super(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
public Fragment getItem(int position) {
CommunitiesFragment communitiesFragment=new CommunitiesFragment();
Bundle bundle=new Bundle();
position=position+1;
bundle.putString("message","Success"+position);
communitiesFragment.setArguments(bundle);
return communitiesFragment;
}
@Override
public int getCount(){
int TabNumber = CommunitiesFragment.tabNumber();
Log.e("InGetCountFunction",TabNumber+"");
return TabNumber;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
position=position+1;
return "COMMUNITY "+position ;
}
public class CommunityViewHolder {
}
}
Firebase数据库的图像
我希望选项卡的数量等于社区的子级数量。
下一步是在各自的选项卡中显示每个子级的嵌套属性
目前TabNumber函数没有提供正确的值,它只显示0。
我还觉得可能是firebase的onDataChanege功能在应用程序启动时没有被触发
错误原因的Logcat:
2019-12-22 20:13:43.670 1408-1460/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
2019-12-22 20:13:52.354 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:52.354 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:52.355 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:52.355 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:52.362 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:52.362 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:52.364 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:52.364 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:52.412 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:52.412 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:54.119 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:54.119 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:54.783 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:54.783 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:54.971 1595-1608/? E/memtrack: Couldn't load memtrack module
2019-12-22 20:13:55.265 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:55.265 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:55.799 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:55.799 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:13:56.263 7275-7275/com.testapp E/Tab Function Value:: 0
2019-12-22 20:13:56.263 7275-7275/com.testapp E/InGetCountFunction: 0
2019-12-22 20:14:04.765 1595-1608/? E/memtrack: Couldn't load memtrack module
数据是从Firebase异步加载的,因为从服务器获取数据可能需要一些时间。您的主代码将继续运行,并(例如)初始化片段,而不是在等待数据时阻塞应用程序。此时,
onDataChange
尚未运行,并且commonVariable
仍设置为其默认值。只有当数据可用时,才会调用onDataChange
,并将commonVariable
设置为正确的值。但此时片段已使用不正确的commonVariable
值呈现
解决方案是将需要数据库数据的任何代码放入
onDataChange
中,或者从那里调用它。有关如何同时执行这两项操作的示例,请参见从Firebase异步加载数据,因为从服务器获取数据可能需要一些时间。您的主代码将继续运行,并(例如)初始化片段,而不是在等待数据时阻塞应用程序。此时,onDataChange
尚未运行,并且commonVariable
仍设置为其默认值。只有当数据可用时,才会调用onDataChange
,并将commonVariable
设置为正确的值。但此时片段已使用不正确的commonVariable
值呈现
解决方案是将需要数据库数据的任何代码放入
onDataChange
中,或者从那里调用它。关于如何做到这两个方面的示例,请参见感谢@Frank van Puffelen的解释,最终了解了问题所在,但是,我尝试了,但我仍然不确定,如何在onDataChange
中添加代码来填充选项卡视图,也参考了链接,但是那里的代码和用例与我需要的完全不同。如果您能帮助我,我会非常感激,这方面有点新,谢谢您的onDataChange
您会想要刷新片段,因为它取决于您正在更改的commonVariable
。快速搜索提示您可能需要在其上调用notifyDataSetChanged
:感谢@Frank van Puffelen的解释,最终了解了问题所在,但是,我尝试了,但我仍然不确定,如何添加代码以填充onDataChange
内的选项卡视图,也参考了链接,但是那里的代码和用例与我需要的完全不同。如果您能帮助我,我会非常感激,这方面有点新,谢谢您的onDataChange
您会想要刷新片段,因为它取决于您正在更改的commonVariable
。快速搜索提示您可能需要对其调用notifyDataSetChanged
: