Firebaseui-android: RecyclerView using FirebaseRecyclerAdapter is not displaying items(Works well during debug)

Created on 29 Jun 2016  路  25Comments  路  Source: firebase/FirebaseUI-Android

I am using FirebaseRecyclerAdapter to load and display items in RecyclerView. When I execute my code it is not displaying any item. It is working perfectly fine when I debug my code.
I have tried notifyDataSetChanged as well.
Sometimes it works when I restart my app again.

Most helpful comment

I used the youtube firecasts#3 video. The issue comes from a line RecycleView.setHasFixedSize(true) . It needs to be removed ! Hope this helps someone !

All 25 comments

i have the same issue. Using the FirebaseRecyclerAdapter its doesnt actually populate the recyclerview until the first item is added?

@meghsmayur @14145057 could you provide some code that would reproduce this issue? Also a sample of the data you're trying to load would be helpful.

I used the youtube firecasts#3 video. The issue comes from a line RecycleView.setHasFixedSize(true) . It needs to be removed ! Hope this helps someone !

@samtstern I am also following firecast recyclerview video. Below is my code:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView =  inflater.inflate(R.layout.fragment_contact, container, false);

    mRecyclerUserDetailView = (RecyclerView) rootView.findViewById(R.id.recyclerViewUserDetail);
    mRecyclerUserDetailView.setHasFixedSize(true);
    mRecyclerUserDetailView.setLayoutManager(new LinearLayoutManager(getContext()));
    mRecyclerUserDetailView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));

    mAdapter = new FirebaseRecyclerAdapter<UserDetail, UserDetailViewHolder>(UserDetail.class,
            R.layout.user_detail_row,
            UserDetailViewHolder.class,
            mRef) {
        @Override
        public void populateViewHolder(UserDetailViewHolder userDetailViewHolder, UserDetail userDetail, int i) {
            userDetailViewHolder.mFullName.setText(userDetail.getFullName());
            userDetailViewHolder.mGender.setText(userDetail.getGender());
            userDetailViewHolder.mAge.setText("15");//userDetail.getAge());
            userDetailViewHolder.mCurrentCity.setText(userDetail.getCurrentCity());
            userDetailViewHolder.mMobileNumber.setText(userDetail.getMobileNumber());
        }
    };

    mAdapter.notifyDataSetChanged();

    mRecyclerUserDetailView.setAdapter(mAdapter);

    return rootView;

}

 private static class UserDetailViewHolder extends RecyclerView.ViewHolder {
    TextView mFullName;
    TextView mGender;
    TextView mAge;
    TextView mCurrentCity;
    TextView mMobileNumber;

    public UserDetailViewHolder(View itemView) {
        super(itemView);
        mFullName = (TextView) itemView.findViewById(R.id.fullNameUser);
        mGender = (TextView) itemView.findViewById(R.id.genderUser);
        mAge = (TextView) itemView.findViewById(R.id.userAge);
        mCurrentCity = (TextView) itemView.findViewById(R.id.currentPlaceUser);
        mMobileNumber = (TextView) itemView.findViewById(R.id.mobileUser);
    }
}

As I said it displays all the values in correct order when I debug but it does not return/display any row during execution.

@meghsmayur what do you mean when you say it displays values during "debug" but not "execution". Where are you seeing the right values?

@samtstern
When I put a breakpoint and debug and run app it displays all the rows but when I run it(Directly not in debug mode) does not display anything.

I guess problem is because of, mRecyclerUserDetailView.setHasFixedSize(true) , as @14145057 said. After removing it, app is working fine. Thanks.

I am having the same issue in my fragment. RecyclerView simply is not populating...


`public class LiveFragment extends Fragment {


private RecyclerView mRecyclerview;
private DatabaseReference mBaseRef;
private DatabaseReference mPollsRef;
private LinearLayoutManager mLayoutManager;

private FirebaseRecyclerAdapter<Poll, PollHolder> mFireAdapter;


// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public LiveFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment LiveFragment.
 */
// TODO: Rename and change types and number of parameters
public static LiveFragment newInstance(String param1, String param2) {
    LiveFragment fragment = new LiveFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBaseRef = FirebaseDatabase.getInstance().getReference();
    mPollsRef = mBaseRef.child("Polls");

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);

    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View v = inflater.inflate(R.layout.fragment_new, container, false);
    Log.v("TAG", "ON CREATE CALLED FROM NEW");

    mRecyclerview = (RecyclerView) v.findViewById(R.id.new_RecyclerView);

    mLayoutManager = new LinearLayoutManager(getContext());
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    return v;
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onStart() {
    super.onStart();


}

@Override
public void onStop() {
    super.onStop();
    if (mFireAdapter != null) {
        mFireAdapter.cleanup();
    }
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mRecyclerview.setLayoutManager(mLayoutManager);

    mFireAdapter = new FirebaseRecyclerAdapter<Poll, PollHolder>(Poll.class, R.layout.latest_item, PollHolder.class, mPollsRef) {
        @Override
        protected void populateViewHolder(PollHolder viewHolder, Poll model, int position) {
            viewHolder.mPollQuestion.setText(model.getQuestion());
            Picasso.with(getActivity().getApplicationContext())
                    .load(model.getImage_URL())
                    .fit()
                    .into(viewHolder.mPollImage);
            Log.v("QUESTION", model.getQuestion());
            Log.v("IMAGE", model.getImage_URL());
        }
    };


    mFireAdapter.notifyDataSetChanged();
    mRecyclerview.setAdapter(mFireAdapter);


}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}


public static class PollHolder extends RecyclerView.ViewHolder {

    TextView mPollQuestion;
    ImageView mPollImage;


    public PollHolder(View itemView) {
        super(itemView);

        mPollQuestion = (TextView) itemView.findViewById(R.id.latest_item_question);
        mPollImage = (ImageView) itemView.findViewById(R.id.pollThumbNailImage);

    }
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}
`

@troy21688 , I have the same, did you find the solution?

// Here is the answer guys , just make your holder class public.

Thanks @14145057. i removed sethasfixedsize and yes it's woking now...

@14145057 Thanks! It works perfectly now!

@14145057 Thanks alot

i'm having the same issue can anyone help me on it ........i'm getting this error in Builder log
error: constructor FirebaseRecyclerAdapter in class FirebaseRecyclerAdapter cannot be applied to given types;required: FirebaseRecyclerOptions..........

public class ChatsFragment extends Fragment {

private RecyclerView mConvList;

private DatabaseReference mConvDatabase;
private DatabaseReference mMessageDatabase;
private DatabaseReference mUsersDatabase;

private FirebaseAuth mAuth;

private String mCurrent_user_id;

private View mMainView;


public ChatsFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    mMainView = inflater.inflate(R.layout.fragment_chats, container, false);

    mConvList = (RecyclerView) mMainView.findViewById(R.id.conv_list);
    mAuth = FirebaseAuth.getInstance();

    mCurrent_user_id = mAuth.getCurrentUser().getUid();

    mConvDatabase = FirebaseDatabase.getInstance().getReference().child("Chat").child(mCurrent_user_id);

    mConvDatabase.keepSynced(true);
    mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    mMessageDatabase = FirebaseDatabase.getInstance().getReference().child("messages").child(mCurrent_user_id);
    mUsersDatabase.keepSynced(true);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);

    mConvList.setHasFixedSize(true);
    mConvList.setLayoutManager(linearLayoutManager);


    // Inflate the layout for this fragment
    return mMainView;
}


@Override
public void onStart() {
    super.onStart();

    Query conversationQuery = mConvDatabase.orderByChild("timestamp");

    **FirebaseRecyclerAdapter<Conv, ConvViewHolder> firebaseConvAdapter = new FirebaseRecyclerAdapter<Conv, ConvViewHolder>**(
            Conv.class,
            R.layout.users_single_layout,
            ConvViewHolder.class,
            conversationQuery
    ) {
        @Override
        protected void populateViewHolder(final ConvViewHolder convViewHolder, final Conv conv, int i) {



            final String list_user_id = getRef(i).getKey();

            Query lastMessageQuery = mMessageDatabase.child(list_user_id).limitToLast(1);

            lastMessageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    String data = dataSnapshot.child("message").getValue().toString();
                    convViewHolder.setMessage(data, conv.isSeen());

                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


            mUsersDatabase.child(list_user_id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    final String userName = dataSnapshot.child("name").getValue().toString();
                    String userThumb = dataSnapshot.child("thumb_image").getValue().toString();

                    if(dataSnapshot.hasChild("online")) {

                        String userOnline = dataSnapshot.child("online").getValue().toString();
                        convViewHolder.setUserOnline(userOnline);

                    }

                    convViewHolder.setName(userName);
                    convViewHolder.setUserImage(userThumb, getContext());

                    convViewHolder.mView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {


                            Intent chatIntent = new Intent(getContext(), ChatActivity.class);
                            chatIntent.putExtra("user_id", list_user_id);
                            chatIntent.putExtra("user_name", userName);
                            startActivity(chatIntent);

                        }
                    });


                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }
    };

    mConvList.setAdapter(firebaseConvAdapter);

}

public static class ConvViewHolder extends RecyclerView.ViewHolder {

    View mView;

    public ConvViewHolder(View itemView) {
        super(itemView);

        mView = itemView;

    }

    public void setMessage(String message, boolean isSeen){

        TextView userStatusView = (TextView) mView.findViewById(R.id.user_single_status);
        userStatusView.setText(message);

        if(!isSeen){
            userStatusView.setTypeface(userStatusView.getTypeface(), Typeface.BOLD);
        } else {
            userStatusView.setTypeface(userStatusView.getTypeface(), Typeface.NORMAL);
        }

    }

    public void setName(String name){

        TextView userNameView = (TextView) mView.findViewById(R.id.user_single_name);
        userNameView.setText(name);

    }

    public void setUserImage(String thumb_image, Context ctx){

        CircleImageView userImageView = (CircleImageView) mView.findViewById(R.id.user_single_image);
        Picasso.with(ctx).load(thumb_image).placeholder(R.drawable.icons_maintenance).into(userImageView);

    }

    public void setUserOnline(String online_status) {

        ImageView userOnlineView = (ImageView) mView.findViewById(R.id.user_single_online_icon);

        if(online_status.equals("true")){

            userOnlineView.setVisibility(View.VISIBLE);

        } else {

            userOnlineView.setVisibility(View.INVISIBLE);

        }

    }


}

}

@patrickmunye do something like this
FirebaseRecyclerOptions options =
new FirebaseRecyclerOptions.Builder()
.setQuery(query, BlockListAttributes.class)
.build();

     adapter= new FirebaseRecyclerAdapter<BlockListAttributes, BlockListAdapter>(options) {
        @Override
        public BlockListAdapter onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_blocked_user, parent, false);
            return new BlockListAdapter(view);
        }

        @Override
        protected void onBindViewHolder(BlockListAdapter holder, int position, BlockListAttributes model) {
            holder.bindToPost(model,position);

        }
    };
    blockListRV.setAdapter(adapter);

i removed setHasFixedSize() but when i run my app( firebase chat app) it shows only the first Message.
I'm confused because i found by debugging that onBindViewHolder() runs exactly the same number of times as it should.

for example: i am having total 4 messages in a chat then onBindViewHolder() runs 4 times but i see only the first message of chat in RecyclerView.

Please Help.

package com.example.abinavsudharshan.mychatapp;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;

import de.hdodenhof.circleimageview.CircleImageView;

public class AllUsersActivity extends AppCompatActivity {
private android.support.v7.widget.Toolbar mToolbar;
private RecyclerView allUsersList;
private DatabaseReference allDatabaseUserReferences;
private RecyclerView.LayoutManager mlayoutmananger;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_users);

    mToolbar= (android.support.v7.widget.Toolbar)findViewById(R.id.all_user_app_bar_layout);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("All Users");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    allUsersList=(RecyclerView)findViewById(R.id.all_user_list);

// allUsersList.setHasFixedSize(true);
allUsersList.setLayoutManager(new LinearLayoutManager(this));

    allDatabaseUserReferences=FirebaseDatabase.getInstance().getReference().child("Users");
    allDatabaseUserReferences.keepSynced(true);

}

@Override
protected void onStart() {
    super.onStart();

    FirebaseRecyclerAdapter<Allusers,AllUsersViewHolder> firebaseRecyclerAdapter=
            new FirebaseRecyclerAdapter<Allusers, AllUsersViewHolder>(
                    Allusers.class,
                    R.layout.all_users_display_layout,
                    AllUsersViewHolder.class,
                    allDatabaseUserReferences
            ) {
                @Override
                protected void populateViewHolder(AllUsersViewHolder viewHolder, Allusers model, int position) {

                    viewHolder.setUser_name(model.getUser_name());
                    viewHolder.setUser_status(model.getUser_status());
                    viewHolder.setUser_image(getApplicationContext(),model.getUser_image());

                }
            };
    allUsersList.setAdapter(firebaseRecyclerAdapter);
}

public static class AllUsersViewHolder extends  RecyclerView.ViewHolder {
    View mView;
    public AllUsersViewHolder(View itemView) {
        super(itemView);
        mView=itemView;
    }
    public  void setUser_name(String user_name){
        TextView name=(TextView)mView.findViewById(R.id.all_users_usersname);
        name.setText(user_name);
    }
    public void  setUser_status(String user_status){
        TextView status=(TextView)mView.findViewById(R.id.all_user_status);
        status.setText(user_status);
    }
    public  void  setUser_image(Context ctx, String user_image){
        CircleImageView image=(CircleImageView) mView.findViewById(R.id.all_user_profile_image);
        Picasso.with(ctx).load(user_image).into(image);
    }

}

}

can any one help me out

@surianmau
I guess you have created wrong database :
When you are sending message add a push method.
ex: databaseRef.push();
databaseRef.setValue(map);
or
databaseRef.push.setValue(map);
Now by this eash meassage will have different key and you can all message.

@14145057 Thanks

Thanks bro it really helped... love you

@troy21688 did you find any solution of this??

I got this Issue, I have update my recycler view -> height : match_parent but, it doesn't work for me.

`
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".OrderStatusActivity">

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Status Pesanan"
android:textSize="24sp"
android:layout_margin="20dp"
android:id="@+id/judul"
android:fontFamily="@font/typo"/>

android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/judul"
android:id="@+id/recycler_status">

`

### Activity

`package com.mpr.judel.ngemil;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.mpr.judel.ngemil.Common.Common;
import com.mpr.judel.ngemil.Model.Pesanan;
import com.mpr.judel.ngemil.ViewHolder.OrderViewHolder;

public class OrderStatusActivity extends AppCompatActivity {

public RecyclerView recyclerView;
public RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference databaseReference;

FirebaseRecyclerAdapter <Pesanan, OrderViewHolder> adapterStatus;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_order_status);

    database = FirebaseDatabase.getInstance();
    databaseReference = database.getReference("Pesanan");

    recyclerView = (RecyclerView)findViewById(R.id.recycler_status);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(layoutManager);

    loadStatus(Common.userSekarang.getNomor());
}

private void loadStatus(String nomor) {
    adapterStatus = new FirebaseRecyclerAdapter<Pesanan, OrderViewHolder>(
            Pesanan.class,
            R.layout.status_item,
            OrderViewHolder.class,
            databaseReference.orderByChild("Nomor").equalTo(nomor)) {
        @Override
        protected void populateViewHolder(OrderViewHolder viewHolder,Pesanan model, int position) {
            viewHolder.txtStatus.setText(model.getStatus());
            viewHolder.txtAlamat.setText(model.getAlamat());
            viewHolder.txtNamaStatus.setText(model.getNama());
        }
    };
    recyclerView.setAdapter(adapterStatus);
}

private String convertStatus(String status) {
    String stringStatus;
    if (status.equals("0")){
        stringStatus="Pesanan sedang diproses";
    }
    else if (status.equals("1")){
        stringStatus="Pengemudi mengantar pesanan";
    }
    else {
        stringStatus = "Pesanan sudah sampai";
    }
    return  stringStatus;
}

}
`

### OrderViewHolder

`package com.mpr.judel.ngemil.ViewHolder;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.mpr.judel.ngemil.Interface.ItemClickListener;
import com.mpr.judel.ngemil.R;

public class OrderViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView txtStatus;
public TextView txtAlamat;
public TextView txtNamaStatus;


private ItemClickListener itemClickListener;

public OrderViewHolder(@NonNull View itemView) {
    super(itemView);
    txtStatus = (TextView)itemView.findViewById(R.id.item_status);
    txtAlamat = (TextView)itemView.findViewById(R.id.item_alamat_status);
    txtNamaStatus = (TextView)itemView.findViewById(R.id.item_nama_status);
    itemView.setOnClickListener(this);
}

public void setItemClickListener(ItemClickListener itemClickListener) {
    this.itemClickListener = itemClickListener;
}

@Override
public void onClick(View v) {
    itemClickListener.onClick(v, getAdapterPosition(),false);
}

}
`

I have an simular issue with my app: nothing is displayed when launching the activity, on app launch but when accessing the same activity through another activity it works...

I have the same issue and removing recyclerView.setHasFixedSize(true) worked for me.
Can anyone explain why Is this so?

I also have the same problem can any of you solve this?

@samtstern
When I put a breakpoint and debug and run app it displays all the rows but when I run it(Directly not in debug mode) does not display anything.

I guess problem is because of, mRecyclerUserDetailView.setHasFixedSize(true) , as @14145057 said. After removing it, app is working fine. Thanks.

It's not working for me what should I do

Was this page helpful?
0 / 5 - 0 ratings