我正在使用nkzawa socket-io库在聊天应用程序上工作。我已成功将消息发送到服务器并将其检索到我的日志猫中。我无法更新UI,因为在适配器中未完成GET消息事件。
我希望能够根据UID或其他人将消息分开,并正确更新UI。到目前为止,我感到困惑如何进行适配器,我应该在适配器还是在Main UI中检索消息?
这是我的适配器代码:
public class MessagesAdapter extends RecyclerView.Adapter<MessagesViewHolder> {
private static final String TAG = MessagesAdapter.class.getSimpleName();
private Context context;
private DBHelper helper;
private TingTingUser user;
private List<HomeMessage> messageList;
public MessagesAdapter(Context context, List<HomeMessage> messageList) {
this.context = context;
this.messageList = messageList;
helper = new DBHelper(context);
}
@Override
public MessagesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View msgView = LayoutInflater.from(parent.getContext()).inflate(R.layout.messages_layout, parent, false);
return new MessagesViewHolder(msgView);
}
@Override
public void onBindViewHolder(MessagesViewHolder holder, int position) {
HomeMessage message = messageList.get(position);
//holder.upDateUI();
}
@Override
public int getItemCount() {
if (messageList.size() == 0) {
return 0;
}
return messageList.size();
}
public void upDateUI(String usersId) {
user = helper.getCurrentUser(1);
String currUid = user.getUserId();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.messages_layout, null, false);
MessagesViewHolder holder = new MessagesViewHolder(view);
Log.d(TAG, "Uid form DB is:t" + currUid);
if (usersId != currUid) {
holder.mainLayout.setGravity(Gravity.LEFT);
holder.nameLayout.setVisibility(View.VISIBLE);
holder.msgHolderLayout.setBackgroundResource(R.drawable.receiver_msg_bkg);
} else {
holder.mainLayout.setGravity(Gravity.RIGHT);
holder.nameLayout.setVisibility(View.GONE);
holder.msgHolderLayout.setBackgroundResource(R.drawable.sender_msg_bkg);
}
} }
这是我检索所有插座消息的方法:
private void getPublicMessages(){
String get_event = "cc-" + chatRoomId;
Log.d(TAG, "Get Event Name is:t " + get_event.toString());
mSocket.on(get_event, new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
JSONObject jsonObject = (JSONObject) args[0];
//JSONObject dataObject = jsonObject.getJSONObject();
String type = jsonObject.getString("type");
Log.d(TAG, "Message is of type:t" + type);
JSONObject contentObject = jsonObject.getJSONObject("content");
String userId = contentObject.getString("userId");
String roomId = contentObject.getString("roomId");
String message = contentObject.getString("message");
String name = contentObject.getString("name");
String avatar = contentObject.getString("avatar");
Log.d(TAG, "Get Message is:t" + message);
Log.d(TAG, "roomId:t" + roomId);
Log.d(TAG, "Get userId is:t" + userId);
Log.d(TAG, "Get name is:t" + name);
Log.d(TAG, "Get avatar is:t" + avatar);
TingTingUser otherUsers = new TingTingUser(userId, "Abhiram Labhani", "Unknown");
HomeMessage othersHomeMessages = new HomeMessage(message, otherUsers, System.currentTimeMillis());
List<HomeMessage> othersList = new ArrayList<>();
othersList.add(othersHomeMessages);
Log.d(TAG, "Other Messages size is:t " + othersList.size());
messageList.add(othersHomeMessages);
messagesAdapter.notifyDataSetChanged();
Log.d(TAG, "All Messages list size is:t " + messageList.size());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
});
}
诸如名称,消息等之类的值直接出现在活动中。我应该如何更新UI,此适配器代码可以工作,还是应该将此方法放入适配器中并相应地进行更新?谢谢大家。
首先,您必须将收到的消息添加到适配器中使用的数据源列表。
第二件事您必须致电
recyclerView.getAdapter().notifyItemInserted(position)
或
recycerView.getAdapter().notifyItemRangeInserted(positionStart, itemCount);
第二个用于通知添加多个项目。