我的应用程序中有聊天功能,我希望对来自同一用户的顺序消息进行分组,类似于下面的图片:
所以,我让我的message_row.xml
有一个TextView来显示一条消息的内容。我的Message模型有一个ArrayList,包含来自同一用户的所有连续消息。
我的CustomMessageAdapter.java
看起来像这样:
if (inflater == null) {
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
// [...]
if (getItemViewType(position) == MINE) {
convertView = inflater.inflate(R.layout.my_message_row, null);
} else {
convertView = inflater.inflate(R.layout.message_row, null);
}
// [...]
TextView senderName = (TextView) convertView.findViewById(R.id.senderName);
TextView content = (TextView) convertView.findViewById(R.id.content);
senderName.setText(message.getSenderName());
//I want to do something like this:
for (int i = 0; i < message.getMessages().size(); i++) {
// display a different TextView for each different message...
}
// [...]
return convertView;
我不能做的是为messages
arraylist中的每个不同消息显示一个新的TextView。
答案 0 :(得分:2)
由于膨胀视图类很昂贵并且更新它们也可能很昂贵,因此采用更简单的方法处理此问题是明智的。我建议简单地将字符串与换行符分隔符连接起来,并将整数应用于消息。
如果您需要对文本显示进行复杂控制,请考虑使用Spannable在单个TextView中格式化文本。
http://developer.android.com/reference/android/text/Spannable.html
如此处所示:Is there any example about Spanned and Spannable text
spanbuffer = new TextView(context);
spanbuffer.setText(newText, TextView.BufferType.SPANNABLE);
Spannable s = (Spannable) spanbuffer.getText();
s.setSpan(new ForegroundColorSpan(Color.RED), 0, newText.length() - 1, 0);
this.append(s);
您可以通过这种方式控制多个文本属性。
答案 1 :(得分:0)
我建议你在message_row.xml
而不是膨胀TextView膨胀线性布局,并在线性布局中以编程方式为每次迭代添加TextViews
for (int i = 0; i < message.getMessages().size(); i++) {
// display a different TextView for each different message...
}
但是,由于膨胀是昂贵的,我建议用新行分割你的消息并将它们全部添加到一个TextView中。
答案 2 :(得分:0)
会为两个人创建一个id,标识waths id并绘制texview,如下所示:
if (iduser.equals("1")){ textviewUser.setText("some text");}else{texviewOther.setText("sometext")}
答案 3 :(得分:0)
将动态textview添加到您的行
private void createTextView(LayoutInflater inflater, LinearLayout llTv) {
llTv.removeAllViews();
int i = 0;
while (i < mMessages.size()) {
View llTv= inflater.inflate(R.layout.textTtem, llTv, false);
TextView textView = (TextView) llTv.findViewById(R.id.tv_message);
textView.setText(mMessage.get(i).getMesage());
textView.setOnClickListener(this);
llTv.addView(textView);
i++;
}
}
你的textitem应该是这样的,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:orientation="vertical">
<TextView
android:id="@+id/tv_message"
android:layout_width="match_parent"
android:padding="..."
android:layout_margin="..."
android:layout_height="wrap_content"
android:textSize="14sp"/>
</LinearLayout>
你可以像这样发送inflater:
mInflater = LayoutInflater.from(mContext);