Search code examples
javaandroidfirebasegoogle-cloud-firestorefirebaseui

Loading data using FirestoreRecyclerView crashing the app


I am trying to load the data from cloud firestore using the FirestoreRecylerView, but every time i open the fragment containing the view, the application crashes. I tried looking up but can't find anything to help me.

PeerInfoRecylerAdapter.java

public class PeerInfoRecyclerAdapter extends  FirestoreRecyclerAdapter<UserInfo,PeerInfoRecyclerAdapter.MyViewHolder> {

public PeerInfoRecyclerAdapter(@NonNull FirestoreRecyclerOptions<UserInfo> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull UserInfo model) {
    holder.authorName.setText(model.getName());
    holder.authorRno.setText(model.getRno());
    holder.authorDept.setText(model.getDept());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.peer_list_item_card, parent, false);
    return new MyViewHolder(itemView);
}

class MyViewHolder extends RecyclerView.ViewHolder{
    private TextView authorName,authorRno,authorDept;
    private MyViewHolder(View view)
    {
        super(view);
        authorName = (TextView) view.findViewById(R.id.peerAuthorText);
        authorRno = (TextView) view.findViewById(R.id.peerAuthorRno);
        authorDept= (TextView) view.findViewById(R.id.peerDept);
    }
}
@Override
public int getItemCount() {
    return 1;
}

}

FragmentDeptOther.java

public class FragmentDeptOther extends Fragment{
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference userRef = db.collection("users");
private PeerInfoRecyclerAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_dept_other,viewGroup, false);
    RecyclerView peerRecycler;
    peerRecycler = (RecyclerView) view.findViewById(R.id.peer_recyler);
    Query query = userRef;
    FirestoreRecyclerOptions<UserInfo> options = new FirestoreRecyclerOptions.Builder<UserInfo>()
        .setQuery(query,UserInfo.class).build();
    adapter = new PeerInfoRecyclerAdapter(options);
    peerRecycler.setHasFixedSize(true);
    peerRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
    peerRecycler.setAdapter(adapter);
    return view;
}
@Override
public void onStart() {
    adapter.startListening();
    super.onStart();
}

@Override
public void onStop() {
    adapter.stopListening();
    super.onStop();
}
}

Logcat I have no idea what's happening.

01-08 16:29:13.795 19871-19871/com.example.root.makingit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.root.makingit, PID: 19871
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.get(ArrayList.java:437)
    at com.firebase.ui.common.BaseObservableSnapshotArray.getSnapshot(BaseObservableSnapshotArray.java:70)
    at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
    at com.firebase.ui.firestore.FirestoreRecyclerAdapter.getItem(FirestoreRecyclerAdapter.java:83)
    at com.firebase.ui.firestore.FirestoreRecyclerAdapter.onBindViewHolder(FirestoreRecyclerAdapter.java:125)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)

Solution

  • The problem is, that your collection (FirestoreRecyclerOptions<UserInfo> options) is empty and you return an itemCount of 1 in your PeerInfoRecyclerAdapter. All you need to do is to delete the following line of code in your PeerInfoRecyclerAdapter (because its already implemented by the FirestoreRecyclerAdapter, which your class is extending from):

    @Override
    public int getItemCount() 
    {
        return 1;
    }