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.
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
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
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: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_height="wrap_content"
android:text="Status Pesanan"
android:textSize="24sp"
android:layout_margin="20dp"
android:id="@+id/judul"
android:fontFamily="@font/typo"/>
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
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 !