我在Android中面临ListView的问题。我尝试使用一些虚拟数据模拟聊天应用程序(在Java代码中添加会话中的前几条消息)。
在虚拟消息之后,用户可以通过明确地输入消息列表来附加消息列表。我使用boolean
将收到的已发送邮件分开,但我发送到列表的邮件显示为received message
,直到我添加新邮件。
我添加的第一个看起来像是已发送的消息,但是新的消息显示为接收等等...我猜它有焦点但不能理解的东西。有问题和源代码的屏幕截图。
适配器类
public class MessageAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<MessageClass> messagesThreadView;
private MessageClass msg;
public MessageAdapter(Context context) {
this.mContext = context;
this.messagesThreadView = new ArrayList<MessageClass>();
}
public void addMessageToThread(MessageClass messageClass) {
this.messagesThreadView.add(messageClass);
notifyDataSetChanged();
}
public void removeMessageFromThread (int position) {
this.messagesThreadView.remove(position);
notifyDataSetChanged();
}
@Override
public int getCount() {
return messagesThreadView.size();
}
@Override
public Object getItem(int i) {
return messagesThreadView.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View view1 = view;
MessageClass tempMessageClass = (MessageClass) getItem(i);
if (view1==null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view1 = inflater.inflate(R.layout.thread_message_layout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.message = (TextView) view1.findViewById(R.id.messageContent);
view1.setTag(viewHolder);
}
ViewHolder vh = new ViewHolder();
vh.message=view1.findViewById(R.id.messageContent);
if (tempMessageClass.isSentFromMyDevice()) {
vh.message.setPadding(20,20,50,20);
vh.message.setGravity(Gravity.END);
// vh.message.setTextColor(Color.argb(255, 253,227,17));
// converted from colors.xml
vh.message.setTextColor(Color.argb(255,255,255,255));
vh.message.setBackgroundColor(Color.argb(255, 114,114,114)); // --||--
notifyDataSetChanged();
} else {
vh.message.setPadding(50,20,20,20);
vh.message.setGravity(Gravity.START);
vh.message.setBackgroundColor(Color.argb(175, 253, 227, 17)); // converted from colors.xml @colors/foreground
notifyDataSetChanged();
}
//final ViewHolder viewHolder = (ViewHolder) view1.getTag();
vh.message.setText(tempMessageClass.text);
return view1;
}
private class ViewHolder {
public TextView message = null;
}
}
编辑:一切正常,直到我决定有2种文本颜色,一种用于接收消息,第二种用于发送消息。现在在向上滚动后,收到的消息文本颜色已被发送的消息文本颜色覆盖。有什么帮助吗?
答案 0 :(得分:0)
首先将数据添加到适配器,然后调用
notifyDataSetChanged
在适配器上
答案 1 :(得分:0)
感谢大家,接受了变化,并且工作几近完美。没有更多的左右移动意外。现在我还有一个问题。传入消息后,伸出可见性字段(当我添加新消息时,焦点始终在最新,而旧消息在顶部)。向上移动的消息会以某种方式丢失文本,我只能看到背景颜色。添加几条消息后,将显示文本。它无法预测。
新的适配器代码在这里:
public View getView(int i, View view, ViewGroup viewGroup) {
View view1 = view;
MessageUserDefinedClass tempMessageUserDefinedClass = (MessageUserDefinedClass) getItem(i);
if (view1 == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view1 = inflater.inflate(R.layout.thread_message_layout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.message = (TextView) view1.findViewById(R.id.messageContent);
view1.setTag(viewHolder);
}
ViewHolder vh = new ViewHolder();
view1.setTag(vh);
if (tempMessageUserDefinedClass.isSentFromMyDevice()) {
vh.message.setPadding(0, 0, 20, 0);
vh.message.setGravity(Gravity.END);
vh.message.setTextColor(Color.argb(255, 253, 227, 17));
vh.message.setBackgroundColor(Color.argb(255, 114, 114, 114));
notifyDataSetChanged();
} else {
vh.message.setPadding(20, 0, 0, 0);
vh.message.setGravity(Gravity.START);
vh.message.setBackgroundColor(Color.argb(255, 253, 227, 17)); // converted from colors.xml @colors/foreground
notifyDataSetChanged();
}
final ViewHolder viewHolder = (ViewHolder) view1.getTag();
viewHolder.message.setText(tempMessageUserDefinedClass.text);
return view1;
}
我想我添加了一些新的ViewHolder,因为第一个是在if语句中创建的。非常感谢。 :)