在我的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布局正在应用
,所有消息都没有变化答案 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();
}
}