Firebase + RecyclerView:RecyclerView在应用程序启动时不显示 [英] Firebase+RecyclerView: RecyclerView not displaying on application start

查看:443
本文介绍了Firebase + RecyclerView:RecyclerView在应用程序启动时不显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Android Studio提供的类,用于在ViewPager中使用操作栏选项卡的选项卡式活动。在这个活动中,我试图用Firebase数据库中的数据初始化一个RecyclerView。



问题:在应用程序的第一次运行中,RecyclerView是空的,如下所示:



如果我在模拟器中关闭并重新打开应用程序,我的RecyclerView将按照下面的方式填充。 >



任何有关为什么会发生这种情况的想法?我有一个理论,但我一直没能找到解决办法。尝试阅读 FragmentPagerAdapter 页面,我得到的印象是碎片必须是静态的(我不知道这可能是什么意思,所以如果任何人都可以在这一点上,这将是值得赞赏的)。在应用程序的第一次运行,它初始化RecyclerView。然后它添加来自Firebase数据库的数据,但由于RecyclerView已经被初始化,所以它是空的,永远不会被正确更新。

StudentFragment的onCreateView方法:

 私人查看视图; 
私有上下文c;
private RecyclerView mRecyclerView;
私有LinearLayoutManager管理器;
私人Firebase mFirebaseRef;
private FirebaseRecyclerAdapter< Student,ViewHolder> firebaseRecyclerAdapter;

$ b $ public查看onCreateView(LayoutInflater inflater,ViewGroup容器,
Bundled savedInstanceState){
view = inflater.inflate(R.layout.fragment_students,container,false) ;
mFirebaseRef =新的Firebase(<您的Firebase链接在这里>);
c = getContext();

//初始化Recycler视图和布局管理器。
mRecyclerView =(RecyclerView)view.findViewById(R.id.studentRecyclerView);
manager = new LinearLayoutManager(c);
mRecyclerView.setHasFixedSize(true);
firebaseRecyclerAdapter =
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);


返回视图;

$ / code>

ViewHolder:

  public static class ViewHolder extends RecyclerView.ViewHolder {
public final TextView vFirst;
public final TextView vLast;
public final TextView vDue;
public final RadioButton vRadio;

public ViewHolder(View itemView){
super(itemView);
vFirst =(TextView)itemView.findViewById(R.id.recycler_main_text);
vLast =(TextView)itemView.findViewById(R.id.recycler_sub_text);
vRadio =(RadioButton)itemView.findViewById(R.id.recycler_radio_button);
vDue =(TextView)itemView.findViewById(R.id.recycler_due_text);

code


主屏幕的onCreate方法:

  protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_homescreen);

//创建一个适配器,它将为活动的三个
//初级部分中的每一个返回一个片段。
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

//用分段适配器设置ViewPager。
mViewPager =(ViewPager)findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

TabLayout tabLayout =(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);






Firebase上下文是在另一个应用程序上设置的,主屏幕活动开始。任何帮助将不胜感激。编辑:我正在挖掘FirebaseUI GitHub页面,这是最可能出现的问题,并发现另一个用户完全相同的问题。似乎onBindViewHolder不会在FirebaseRecyclerAdapter类中的notifyItemInserted之后调用。现在来解决它...

解决方案

在我的情况下,这是由 mRecyclerView.setHasFixedSize(true ); 如果你注释掉这行代码,列表会正确加载。我从这个讨论中得到了我的解决方案: https://github.com/firebase/FirebaseUI- Android / issues / 204


I'm using the Android Studio provided class for a tabbed activity that uses Action Bar Tabs with ViewPager. Inside this activity, I'm trying to initialize a RecyclerView with data from a Firebase database.

Problem: On the app's first run, the RecyclerView is empty as shown below.

If I close and reopen the application from within the emulator, my RecyclerView gets populated as it should, as shown below.

Any ideas as to why this might be happening? I have a theory but I haven't been able to find a solution. After trying to read the FragmentPagerAdapter page, I got the impression that the fragments must be static (I don't know what the implications of this might be, so if anyone can shed some light on this it would be appreciated). On the app's first run, it initializes the RecyclerView. It then adds the data from the Firebase database but since the RecyclerView has already been initialized it is empty and is never properly updated. I tried calling the notify... methods to no avail.

StudentFragment's onCreateView method:

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;
}

ViewHolder:

public static class ViewHolder extends RecyclerView.ViewHolder {
    public final TextView vFirst;
    public final TextView vLast;
    public final TextView vDue;
    public final RadioButton vRadio;

    public ViewHolder(View itemView) {
        super(itemView);
        vFirst = (TextView) itemView.findViewById(R.id.recycler_main_text);
        vLast = (TextView) itemView.findViewById(R.id.recycler_sub_text);
        vRadio = (RadioButton) itemView.findViewById(R.id.recycler_radio_button);
        vDue = (TextView) itemView.findViewById(R.id.recycler_due_text);
}

Homescreen's onCreate method:

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 context is set on another application that starts as soon as the Homescreen activity starts. Any help will be appreciated.

Edit: I was digging through the FirebaseUI GitHub page, which is where the problem most likely lies, and found another user with the exact same problem. It seems that onBindViewHolder isn't called after notifyItemInserted in the FirebaseRecyclerAdapter class. Now to fix it...

解决方案

In my case this was caused by mRecyclerView.setHasFixedSize(true); If you comment out this line of code the list loads properly. I got my solution from this discussion: https://github.com/firebase/FirebaseUI-Android/issues/204

这篇关于Firebase + RecyclerView:RecyclerView在应用程序启动时不显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆