Android fragments Firebase+;RecyclerView:RecyclerView在应用程序启动时不显示
我正在使用Android Studio提供的类进行选项卡式活动,该活动使用带有ViewPager的操作栏选项卡。在这个活动中,我试图用Firebase数据库中的数据初始化RecyclerView 问题:在应用程序第一次运行时,RecyclerView为空,如下所示 如果我在emulator中关闭并重新打开应用程序,我的RecyclerView将按其应该的方式填充,如下所示 你知道为什么会这样吗?我有一个理论,但还没有找到解决办法。在尝试阅读该页面后,我得到的印象是,这些片段必须是静态的(我不知道这可能意味着什么,因此,如果有人能对此有所了解,我将不胜感激)。在应用程序第一次运行时,它会初始化RecyclerView。然后添加Firebase数据库中的数据,但由于RecyclerView已经初始化,因此它是空的,并且从未正确更新。我试着打电话通知。。。方法无效 StudentFragment的onCreateView方法:Android fragments Firebase+;RecyclerView:RecyclerView在应用程序启动时不显示,android-fragments,firebase,android-recyclerview,firebaseui,Android Fragments,Firebase,Android Recyclerview,Firebaseui,我正在使用Android Studio提供的类进行选项卡式活动,该活动使用带有ViewPager的操作栏选项卡。在这个活动中,我试图用Firebase数据库中的数据初始化RecyclerView 问题:在应用程序第一次运行时,RecyclerView为空,如下所示 如果我在emulator中关闭并重新打开应用程序,我的RecyclerView将按其应该的方式填充,如下所示 你知道为什么会这样吗?我有一个理论,但还没有找到解决办法。在尝试阅读该页面后,我得到的印象是,这些片段必须是静态的(我不
private View view;
private Context c;
private RecyclerView mRecyclerView;
private LinearLayoutManager manager;
private Firebase mFirebaseRef;
private FirebaseRecyclerAdapter<Student, ViewHolder> firebaseRecyclerAdapter;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_students, container, false);
mFirebaseRef = new Firebase("<your Firebase link here>");
c = getContext();
//Initializes Recycler View and Layout Manager.
mRecyclerView = (RecyclerView) view.findViewById(R.id.studentRecyclerView);
manager = new LinearLayoutManager(c);
mRecyclerView.setHasFixedSize(true);
firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<Student, ViewHolder>(
Student.class,
R.layout.single_student_recycler,
ViewHolder.class,
mFirebaseRef
) {
@Override
protected void populateViewHolder(ViewHolder viewHolder, Student student, int i) {
viewHolder.vFirst.setText(student.getFirst());
viewHolder.vLast.setText(student.getLast());
viewHolder.vDue.setText(Double.toString(student.getCurrentlyDue()));
viewHolder.vRadio.setButtonTintList(ColorStateList.valueOf(Color.parseColor(student.getColor())));
Log.d(TAG, "populateViewHolder called");
}
};
mRecyclerView.setAdapter(firebaseRecyclerAdapter);
mRecyclerView.setLayoutManager(manager);
return view;
}
主屏幕的onCreate方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_homescreen);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
Firebase上下文设置在另一个应用程序上,该应用程序在主屏幕活动启动后立即启动。任何帮助都将不胜感激
编辑:我在FirebaseUI GitHub页面中搜索,这是最有可能出现问题的地方,发现另一个用户也有同样的问题。似乎在FirebaseRecyclerAdapter类中插入NotifyItem之后没有调用onBindViewHolder。现在要解决它…让我试试,就像你在问题标题上说的那样 RecyclerView在应用程序启动时不显示 那么 初始化回收器视图和布局管理器 应在onStart上声明
@Override
public void onStart() {
super.onStart();
mFirebaseRef = new Firebase("<your Firebase link here>");
firebaseRecyclerAdapter = ...
//and so on
@覆盖
public void onStart(){
super.onStart();
mFirebaseRef=新Firebase(“”);
firebaseRecyclerAdapter=。。。
//等等
希望有帮助
firebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = firebaseRecyclerAdapter.getItemCount();
int lastVisiblePosition =
linearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
linearLayoutManager.scrollToPosition(positionStart);
}
}
});
recyclerListIdeas.setAdapter(firebaseRecyclerAdapter);
**只需添加Recyclerview.AdapterDataObserver()。对我有用!希望它有帮助:)**我也有同样的问题,请查看文档: 通过添加数据观察者修复了此问题:
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});
在我的例子中,这是由
mRecyclerView.setHasFixedSize(true)引起的
如果您注释掉这行代码,列表将正确加载。我从这次讨论中得到了解决方案:我正试图做与您相同的事情,但无法实现,以下是我的问题的解释,以防您有时间查看。谢谢!谢谢!这也是我的问题!太好了,我的问题也是如此。
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});