向适配器添加新数据会影响初始值
Adding new data to Adapter affects initial values
我正在尝试构建一个简单的聊天界面。当用户单击 enter
时,他们的消息被发送到服务器,添加到数据库并同时插入到客户端设备上的 MessageAdapter
中,因此它出现在他们的屏幕上。
来自用户的消息右对齐,非用户则相反。
当用户发送一条消息时,与所有消息向上移动一个位置相反,文本向上移动,但实际消息对象没有。
我正在尝试让用户发送一条消息,并且所有以前的消息有效地向上移动,以便新消息可以显示在下方。
最初非用户消息是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);
}
}
}
然后这是 send-message action
:
的代码
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);
我正在尝试构建一个简单的聊天界面。当用户单击 enter
时,他们的消息被发送到服务器,添加到数据库并同时插入到客户端设备上的 MessageAdapter
中,因此它出现在他们的屏幕上。
来自用户的消息右对齐,非用户则相反。
当用户发送一条消息时,与所有消息向上移动一个位置相反,文本向上移动,但实际消息对象没有。
我正在尝试让用户发送一条消息,并且所有以前的消息有效地向上移动,以便新消息可以显示在下方。
最初非用户消息是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);
}
}
}
然后这是 send-message action
:
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);