我正在尝试从自定义适配器获取项目计数用于聊天应用程序,但它总是返回零如何解决这个问题?

时间:2018-05-09 14:10:27

标签: android firebase firebase-realtime-database recycler-adapter custom-adapter

我正在使用RecyclerView和List类创建一个聊天应用程序来存储来自Firebase数据库的消息,并希望在打开聊天活动时在recylcerView的底部滚动,但错误是.....在调用时,适配器始终返回零adapter.getItemcount()方法。所有消息都显示没有问题。

  

自定义适配器java文件

public class ChatCustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
                    private FirebaseUser mUser;
                    private String currentUser;
                    private List<ChatModel> msgList;

                    //Constructor
                    public ChatCustomAdapter(List<ChatModel> msgList) {
                        this.msgList = msgList;
                        FirebaseAuth mAuth = FirebaseAuth.getInstance();
                        mUser = mAuth.getCurrentUser();
                        currentUser = mUser.getUid();
                    }
                    @Override
                    public int getItemCount() {
                        return msgList.size(); 
                    }



                    @Override
                    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                        View v;
                        if(viewType==0){
                            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_single__user_item_layout,parent,false);
                            return new SelfViewHolder(v);
                        }else if(viewType==1){
                            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_single_other_user_item_layout,parent,false);
                            return new OtherViewHolder(v);
                        }else{
                            return null;
                        }
                    }

                    @Override
                    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                        int layout = holder.getItemViewType();
                        ChatModel model = msgList.get(position);
                        String msg = model.getMsg();
                        if(layout==0){
                            SelfViewHolder sHolder = (SelfViewHolder)holder;
                            sHolder.setSelfMsgItems(msg);
                        }else if(layout==1){
                            OtherViewHolder oHolder = (OtherViewHolder)holder;
                            oHolder.setOtherMsgItems(msg);
                        }
                    }

                    @Override
                    public int getItemViewType(int position) {
                        super.getItemViewType(position);
                        int layout;
                        ChatModel model = msgList.get(position);
                        String from = model.getFrom();
                        if(from.equals(currentUser)){
                            layout=0;
                        }else{
                            layout=1;
                        }
                        return layout;
                    }


                    class SelfViewHolder extends RecyclerView.ViewHolder{
                        TextView msgtxt,timetxt;
                        SelfViewHolder(View itemView) {
                            super(itemView);
                            msgtxt = itemView.findViewById(R.id.chat_sinhle_user_item_textview);
                            timetxt = itemView.findViewById(R.id.chat_sinhle_user_item_timeview);
                        }

                        void setSelfMsgItems(String data){
                            msgtxt.setText(data);
                        }
                    }

                    class OtherViewHolder extends RecyclerView.ViewHolder{
                        TextView msgtxt,timetxt;
                        public OtherViewHolder(View itemView) {
                            super(itemView);
                            msgtxt = itemView.findViewById(R.id.chat_other_user_item_textview);
                            timetxt = itemView.findViewById(R.id.chat_other_user_item_timeview);

                        }
                        public void setOtherMsgItems(String data){
                            msgtxt.setText(data);
                        }
                    }
                }
  

聊天活动java文件

protected void onStart() {
        super.onStart();
        //region RETREIVING MESSAGES FROM SERVER
        msgQ = mDatabase.child("messages").child(current_user).child(otherusername).orderByChild("time");
        msgQ.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                ChatModel model = dataSnapshot.getValue(ChatModel.class);
                mLsit.add(msgposition++, model);
                mAdapter.notifyDataSetChanged();
            }

            @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) {

            }
        });
        //endregion
        recyclerView.scrollToPosition(mAdapter.getItemCount()-1);
  }

1 个答案:

答案 0 :(得分:0)

我认为getItemCount()返回零,因为您在ChildEventListener之外调用此方法。因此,当mLsit中没有元素时,您将检索itemcount。 这里最快且有点脏的解决方案是将scrollToPosition置于onChildAdded方法中。另外,我会这样修改代码

protected void onStart() {
    super.onStart();
    //region RETREIVING MESSAGES FROM SERVER
    msgQ = mDatabase.child("messages").child(current_user).child(otherusername).orderByChild("time");
    msgQ.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ChatModel model = dataSnapshot.getValue(ChatModel.class);
            mLsit.add(msgposition, model);
            mAdapter.notifyItemInserted(msgposition)
            recyclerView.scrollToPosition(msgposition);
            msgposition++;
        }

        @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) {

        }
        });
        //endregion
  }