我试图使用FirestoreRecylerView从Cloud Firestore加载数据,但是每次我打开包含该视图的片段时,应用程序就会崩溃。我尝试查找,但找不到任何可以帮助我的东西。
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 我不知道发生了什么。
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)
答案 0 :(得分:0)
问题在于,您的收藏集(FirestoreRecyclerOptions<UserInfo> options
)为空,并且您在itemCount
中返回了PeerInfoRecyclerAdapter
的1。您需要做的就是删除PeerInfoRecyclerAdapter
中的以下代码行(因为该类已经由FirestoreRecyclerAdapter
实现了,您的类将从该代码实现):
@Override
public int getItemCount()
{
return 1;
}