recyclerview与两个viewtypes不chaning viewtype

时间:2017-10-11 07:32:10

标签: android firebase android-recyclerview firebase-authentication

在我的android firebase聊天应用程序中,我想使用recyclerview根据消息类型显示聊天列表,即传入或传出

首先让我告诉你firebase数据结构

<ConversationId>
    <MsgId>
       text :"Hello"
       timestamp :<timestamp>
       sender :<sender's uid>
       receiver :<receiver's uid>

以下是我的适配器类

public class MultiViewTypeAdapter  extends RecyclerView.Adapter {

        private List<SingleChatList> chatList;
        int total_types;


        public class incoming extends RecyclerView.ViewHolder
        {
            public TextView message,time;
            //public CircleImageView dp;

            public incoming(View view)
            {
                super(view);
                message=(TextView)view.findViewById(R.id.message_text);
                time=(TextView)view.findViewById(R.id.timestamp_text);
            }
        }

        public class outgoing extends RecyclerView.ViewHolder
        {
            public TextView message,time;
            //public CircleImageView dp;

            public outgoing(View view)
            {
                super(view);
                message=(TextView)view.findViewById(R.id.message_text_view);
                time=(TextView)view.findViewById(R.id.timestamp_text_view);
            }
        }



        public MultiViewTypeAdapter(List<SingleChatList> data) {
            this.chatList = data;
            total_types = chatList.size();
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view;
            switch (viewType) {
                case 0:
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_incoming_bubble, parent, false);
                    return new incoming(view);
                case 1:
                    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_outgoing_bubble, parent, false);
                    return new outgoing(view);

            }
            return null;
        }
        @Override
        public int getItemViewType(int position) {

            int swi=0;
            if(chatList.get(position).getSender()== FirebaseAuth.getCurrentUser().getUid())
            {
                swi=1;
            }
            else
            {
                swi=0;
            }
            return swi;


        }
        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {

            SingleChatList chat=chatList.get(listPosition);

            if (chat != null) {
                int swi=0;
                if(chat.getSender()== FirebaseAuth.getCurrentUser().getUid())
                {
                    swi=1;
                }
                else
                {
                    swi=0;
                }
                switch (swi) {
                    case 0:
                        ((incoming) holder).message.setText(chat.getMsg());
                        ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp()));

                        break;
                    case 1:
                        ((outgoing) holder).message.setText(chat.getMsg());
                        ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp()));
                        break;

                }
            }
        }


        @Override
        public int getItemCount() {
            return chatList.size();
        }
    }

在这里,我使用以下逻辑决定viewtype

senderuid== FirebaseAuth.getCurrentUser().getUid();

如果上述条件为真,那么它应该是传出消息。

我运行上面的代码,但是只有传入的msg布局正在应用

,所有消息都没有变化

2 个答案:

答案 0 :(得分:0)

您需要在JSONObject jsonObject1 = new JSONObject(); try { jsonObject1.put("email", "abc@gmail.com"); jsonObject1.put("fname", "abc"); jsonObject1.put("lname", "def"); jsonObject1.put("pwd", "123"); } catch (JSONException e) { e.printStackTrace(); } Map<String, String> postParam = new HashMap<>(); postParam.put("jsonrpc", "2.0"); postParam.put("method", "signUp"); postParam.put("id", "1"); postParam.put("params", jsonObject1.toString()); CustomRequest jsObjRequest = new CustomRequest( Request.Method.POST, URL, postParam, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { } }); mRequestQueue.add(jsObjRequest);

中使用viewHolder.getItemViewType()

尝试以下代码

onBindViewHolder

注意:请了解java命名约定伙伴:)

答案 1 :(得分:0)

在你的代码中,你为每个case使用return。将一个值赋给一个局部变量,然后在最后返回它被认为是一个好习惯。具有多个出口的方法难以调试并且难以阅读。另外,您最后将null作为视图保持器。请尝试此更新的代码并检查其是否有效。

public class MultiViewTypeAdapter extends RecyclerView.Adapter {

private List<SingleChatList> chatList;
int total_types;

public class incoming extends RecyclerView.ViewHolder {
    public TextView message, time;

    //public CircleImageView dp;
    public incoming(View view) {
        super(view);
        message = (TextView) view.findViewById(R.id.message_text);
        time = (TextView) view.findViewById(R.id.timestamp_text);
    }
}

public class outgoing extends RecyclerView.ViewHolder {
    public TextView message, time;
    //public CircleImageView dp;

    public outgoing(View view) {
        super(view);
        message = (TextView) view.findViewById(R.id.message_text_view);
        time = (TextView) view.findViewById(R.id.timestamp_text_view);
    }
}

public MultiViewTypeAdapter(List<SingleChatList> data) {
    this.chatList = data;
    total_types = chatList.size();
}


@Override
public int getItemViewType(int position) {
    int swi = 0;
    if (chatList.get(position).getSender() == FirebaseAuth.getCurrentUser().getUid()) {
        swi = 1;
    } else {
        swi = 0;
    }
    return swi;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder holder = null;
    View view;
    switch (viewType) {
        case 0:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_incoming_bubble, parent, false);
            holder = new incoming(view);
            break;
        case 1:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_outgoing_bubble, parent, false);
            holder = new outgoing(view);
            break;
    }
    return holder;
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {

    SingleChatList chat = chatList.get(listPosition);
    switch (holder.getItemViewType()) {
        case 0:
            if (chat != null) {
                ((incoming) holder).message.setText(chat.getMsg());
                ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp()));
            }
            break;
        case 1:
            if (chat != null) {
                ((outgoing) holder).message.setText(chat.getMsg());
                ((incoming) holder).time.setText(String.valueOf(chat.getTimestamp()));
            }
            break;
    }
}

@Override
public int getItemCount() {
    return chatList.size();
}
}