java - 向适配器添加新数据会影响初始值

标签 java android android-recyclerview android-arrayadapter

我正在尝试构建一个简单的聊天界面。当用户点击 enter 时,他们的消息被发送到服务器,添加到数据库并同时插入到客户端设备上的 MessageAdapter 中,因此它出现在他们的屏幕上。

来自用户的消息是右对齐的,反之亦然。

当用户发送一条消息时,与所有消息向上移动一个位置相反,文本向上移动,但实际消息对象不会向上移动。

我正在尝试让用户发送一条消息,并且所有之前的消息有效地向上移动,以便新消息可以显示在下方。

Original message structure

Post-message sent structure

最初,非用户消息是Hello,但在我发送用户消息后,非用户下方的消息Hey 取代了它。

这是我的 MessageAdapter 代码:

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

List<Message> data= Collections.emptyList();
List<Integer> message_type= Collections.emptyList();

// create constructor to initialize context and data sent from MainActivity
public MessageAdapter(List<Message> data, List<Integer> message_type) {
    this.data=data;
    this.message_type=message_type;
}

public void addItem(Message item, int message_type){

    this.data.add(item);
    this.message_type.add(0, message_type);

}

// Inflate the layout when ViewHolder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    switch (i) {
        case 0:
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_non_user, viewGroup, false);
            return new ViewHolder0(v);
        case 2:
            View q = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_user, viewGroup, false);
            return new ViewHolder1(q);
    }
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_non_user, viewGroup, false);
    return new ViewHolder1(v);
}

// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
    switch (viewHolder.getItemViewType()) {
        case 0:
            ViewHolder0 viewHolder0 = (ViewHolder0)viewHolder;
            Message current0 = data.get(position);
            viewHolder0.body.setText(current0.message);
            break;

        case 2:
            ViewHolder1 viewHolder1 = (ViewHolder1)viewHolder;
            Message current1 = data.get(position);
            viewHolder1.body.setText(current1.message);
            break;
    }
}

// return total item from List
@Override
public int getItemCount() {
    return data.size();
}

@Override
public int getItemViewType(int position) {
    int temp = message_type.get(position);
    if(temp == 0 ){
        return 0;
    }
    return 2;

}
class ViewHolder0 extends RecyclerView.ViewHolder {

    TextView body;

    public ViewHolder0(final View itemView) {
        super(itemView);
        body = (TextView) itemView.findViewById(R.id.message_body);
    }
}

class ViewHolder1 extends RecyclerView.ViewHolder {

    TextView body;

    public ViewHolder1 (final View itemView) {
        super(itemView);
        body = (TextView) itemView.findViewById(R.id.message_body);

    }
}
}

然后这是发送消息操作的代码:

 Message user_input = new Message();
 user_input.message = chat_input.getText().toString();
 messageAdapter.addItem(user_input, 0);

 messageAdapter.notifyItemInserted(messageAdapter.getItemCount()+1);

 MessagesRecyclerview.scrollToPosition(messageAdapter.getItemCount() - 1);
 messageAdapter.notifyDataSetChanged();
 chat_input.getText().clear();

感谢您的帮助:)

最佳答案

这可能是因为您是这样添加数据的:

this.data.add(item);
this.message_type.add(0, message_type);

您在列表的开头添加您的类型,但您在列表的末尾添加您的数据,所以看起来您的数据发生了变化。 使用这个:

this.data.add(0,item);
this.message_type.add(0, message_type); 

或者这个:

this.data.add(item);
this.message_type.add(message_type);

关于java - 向适配器添加新数据会影响初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51335705/

相关文章:

java - 将照片发布到页面时出现意外错误

java - 设计模式 : How to create synchronized method or block in Singleton pattern in Java?

java - 我的对象未打印到我的 JavaFX TableView

java - BestPractices : Is it bad OOP to subclass standard classes into a new one that does same thing, 但 "presuming" future 有变化吗?

android - 有没有办法重用 attr inputType?

java - dex2jar 和 JD-GUI 标签语句

java - 如何将RecyclerView添加到LinearLayout(高度问题)

java - 自定义 Spring AOP 注解不适用于默认方法

android - notifyItemChanged() 是否强制调用 onBindViewHolder()?

java - 如何使用 arraylist 制作可扩展列表?