ListView在每一行中包含不同数量的TextView

时间:2015-07-30 20:31:48

标签: java android baseadapter

我的应用程序中有聊天功能,我希望对来自同一用户的顺序消息进行分组,类似于下面的图片:

Mock-up

所以,我让我的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。

4 个答案:

答案 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);