【问题标题】:arraylist add to new recyclerviewarraylist 添加到新的 recyclerview
【发布时间】:2019-02-13 17:31:51
【问题描述】:

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

但是当我尝试将新项目添加到 Arraylist(发送新消息)时,我得到一个 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() 对象,但您从未在其上调用setUser(),因此当您调用getUser() 时,您的user 字段为null
  • 发布您的UserChatActivity 是否发生 NullPointerException
  • 将getUser方法改为public ChatMessageUser getUser() { if(user == null){ user = new ChatMessageUser(); } return user; }

标签: android rest arraylist android-recyclerview rx-java2


【解决方案1】:

我认为你需要初始化私有ArrayList messageArrayList; 您需要先创建新的 ArrayList,然后再在此列表中添加包含

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 现在我尝试了这个,但现在我没有收到任何错误,但它没有插入项目:ChatMessages add = new ChatMessages(); add.setMessage(message); add.setCreatedAt(1536407395); ChatMessageUser user = new ChatMessageUser(); user.setUserId(userid); add.setUser(user); messageArrayList.add(add);
    • 交换行:user.setUserId(userid); add.setUser(user);
    • 在调用用户对象的任何方法之前必须设置用户对象
    猜你喜欢
    • 2019-02-10
    • 2015-05-26
    • 1970-01-01
    • 2015-03-30
    • 2015-09-07
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多