阵列列表添加到新的回收器视图 [英] arraylist add to new recyclerview

查看:55
本文介绍了阵列列表添加到新的回收器视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在尝试将一个新项目添加到我的聊天中,我使用RXJava2调用REST API来获取聊天数据,并使用此嵌套的json响应。

但当我尝试将新项目添加到数组列表(发送新邮件)时,出现NullPointer值:

09-08 13:35:14.529 2869-2869/com.jonathan.myapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.jonathan.myapp, PID: 2869
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.jonathan.myapp.models.ChatMessageUser.setUserId(java.lang.String)' on a null object reference
        at com.jonathan.myapp.ui.activity.UserChatActivity.attemptSend(UserChatActivity.java:368)
        at com.jonathan.myapp.ui.activity.UserChatActivity.access$000(UserChatActivity.java:56)
        at com.jonathan.myapp.ui.activity.UserChatActivity$3.onClick(UserChatActivity.java:161)

我用来发送消息的代码是:

private ArrayList<ChatMessages> messageArrayList;

private void attemptSend() {
    if (TextUtils.isEmpty(message)) {
        mInputMessageView.requestFocus();
        return;
    }

    mInputMessageView.setText("");

    String userid = "1";

    ChatMessages add = new ChatMessages();
    add.setMessage(message);
    add.setCreatedAt(1536407395);
    add.getUser().setUserId(userid);

    messageArrayList.add(add);

    mAdapter.notifyDataSetChanged();
    if (mAdapter.getItemCount() > 1) {
        // scrolling to bottom of the recycler view
        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1);
    }
}

嵌套的JSON:

{
    "error": false,
    "messages": [
        {
            "message": "hej 😀",
            "message_id": 15,
            "created_at": 1509383626,
            "readedAt": 1536331345,
            "user": {
                "user_id": 2,
                "username": "Lasse",
                "userprofilepicture": "https://static.pexels.com/photos/305239/pexels-photo-305239.jpeg"
            }
        },
        {
            "message": "hej 😡 kar",
            "message_id": 24,
            "created_at": 1510411308,
            "readedAt": 1511165097,
            "user": {
                "user_id": 1,
                "username": "Jonathan",
                "userprofilepicture": "https://d2lm6fxwu08ot6.cloudfront.net/img-thumbs/960w/7YWI2KZZ6N.jpg"
            }
        }
    ],
    "chat_room": {
        "roomId": 1,
        "displayName": "Jonathan",
        "displayNameImage": "https://d2lm6fxwu08ot6.cloudfront.net/img-thumbs/960w/7YWI2KZZ6N.jpg",
        "createdDate": "1532032759"
    }
}

我的ChatThreadAdapter:

public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private String userId;
    private int SELF = 100;
    private static String today;

    private Context mContext;
    private ArrayList<ChatMessages> messageArrayList;

    public List<ChatMessages> getChatMessages(){
        return messageArrayList;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView message, timestamp, readedstatus;
        ImageView profileimage;

        public ViewHolder(View view) {
            super(view);
            message = (TextView) itemView.findViewById(R.id.message);
            timestamp = (TextView) itemView.findViewById(R.id.timestamp);
            readedstatus = (TextView) itemView.findViewById(R.id.readedstatus);
            profileimage = (ImageView) itemView.findViewById(R.id.avater_image);
        }
    }

    public ChatRoomThreadAdapter(Context mContext, ArrayList<ChatMessages> messageArrayList, String userId) {
        this.mContext = mContext;
        this.messageArrayList = messageArrayList;
        this.userId = userId;

        Calendar calendar = Calendar.getInstance();
        today = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView;
        if (viewType == SELF) {
            itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_message_right, parent, false);
        } else {
            itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_message_left, parent, false);
        }
        return new ViewHolder(itemView);
    }

    @Override
    public int getItemViewType(int position) {
        ChatMessages message = messageArrayList.get(position);
        if (message.getUser().getUserId().equals(userId)) {
            return SELF;
        }
        return position;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        ChatMessages message = messageArrayList.get(position);

        String timestamp = TextUtils.getDateTimeStampWithTime(message.getCreatedAt());
        String fimage = message.getUser().getUserprofilepicture();
        String readedat = TextUtils.getDateTimeStampWithTime(message.getReadedAt());

        if (message.getUser().getUserId().equals(userId)) {
            // Self
            ((ViewHolder) holder).message.setText(Html.fromHtml(message.getMessage()));

            if (message.getUser().getUsername() != null)
                ((ViewHolder) holder).timestamp.setText(timestamp);

            ((ViewHolder) holder).readedstatus.setVisibility(View.GONE);
            ((ViewHolder) holder).readedstatus.setVisibility(View.GONE);


        } else {
            // Other
            ((ViewHolder) holder).message.setText(Html.fromHtml(message.getMessage()));

            if (message.getUser().getUsername() != null)
                ((ViewHolder) holder).timestamp.setText(timestamp);

            if (fimage.isEmpty()) {
                Picasso.with(mContext).load(R.drawable.ic_no_user)
                        .resize(80, 80)
                        .into(((ViewHolder) holder).profileimage);
            } else {
                Picasso.with(mContext).load(fimage)
                        .resize(80, 80)
                        .into(((ViewHolder) holder).profileimage);
            }
            if (message.getReadedAt().toString().equals("0")){
                ((ViewHolder) holder).readedstatus.setText(mContext.getResources().getString(R.string.message_delivered));
            } else {
                ((ViewHolder) holder).readedstatus.setText(mContext.getResources().getString(R.string.message_readed_at) + " " + readedat);
            }
        }
    }

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

和我的型号:

public class ChatMessages {
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("message_id")
    @Expose
    private Integer messageId;
    @SerializedName("created_at")
    @Expose
    private Integer createdAt;
    @SerializedName("readedAt")
    @Expose
    private Integer readedAt;
    @SerializedName("user")
    @Expose
    private ChatMessageUser user;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getMessageId() {
        return messageId;
    }

    public void setMessageId(Integer messageId) {
        this.messageId = messageId;
    }

    public Integer getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Integer createdAt) {
        this.createdAt = createdAt;
    }

    public Integer getReadedAt() {
        return readedAt;
    }

    public void setReadedAt(Integer readedAt) {
        this.readedAt = readedAt;
    }

    public ChatMessageUser getUser() {
        return user;
    }

    public void setUser(ChatMessageUser user) {
        this.user = user;
    }
}

And the ChatMessageUser model:

public class ChatMessageUser {
    @SerializedName("user_id")
    @Expose
    private String userId;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("userprofilepicture")
    @Expose
    private String userprofilepicture;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserprofilepicture() {
        return userprofilepicture;
    }

    public void setUserprofilepicture(String userprofilepicture) {
        this.userprofilepicture = userprofilepicture;
    }
}

ChatMessages

实例化推荐答案对象时,该对象中的用户字段为空。 在调用add.getUser().setUserId(userid)之前,必须调用setUser(ChatMessageUser user)方法并将现有的User对象传递给该方法。

这篇关于阵列列表添加到新的回收器视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆