更新带有套接字消息的Recyclerview UI



我正在使用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);

第二个用于通知添加多个项目。

最新更新