Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每行具有不同数量文本视图的ListView_Java_Android_Baseadapter - Fatal编程技术网

Java 每行具有不同数量文本视图的ListView

Java 每行具有不同数量文本视图的ListView,java,android,baseadapter,Java,Android,Baseadapter,我的应用程序中有聊天功能,我想对来自同一用户的连续消息进行分组,类似于下面的图片: 因此,我的message_row.xml带有一个文本视图,用于显示一条消息的内容。我的消息模型有一个ArrayList,其中包含来自同一用户的所有连续消息 我的CustomMessageAdapter.java如下所示: if (inflater == null) { inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT

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

因此,我的
message_row.xml
带有一个文本视图,用于显示一条消息的内容。我的消息模型有一个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;
if(充气机==null){
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
// [...]
如果(getItemViewType(位置)=我的){
convertView=充气机。充气(R.layout.my_消息行,空);
}否则{
convertView=充气机。充气(R.layout.message_行,空);
}
// [...]
TextView senderName=(TextView)convertView.findViewById(R.id.senderName);
TextView content=(TextView)convertView.findViewById(R.id.content);
setText(message.getSenderName());
//我想这样做:
对于(int i=0;i

我不能做的是在
messages
arraylist中为每个不同的消息显示一个新的文本视图。

由于膨胀视图类很昂贵,更新它们也可能很昂贵,因此明智的做法是采取更简单的方法来解决此问题。我建议简单地将字符串与换行符分隔符连接起来,并将整个字符串应用于消息

进一步思考

如果您需要对文本的显示进行复杂的控制,请考虑使用SPANNABLE在单个文本视图中格式化您的文本。

如下所示:


您可以通过这种方式控制多个文本属性。

我建议在您的
消息行.xml
中,不要膨胀文本视图,而是膨胀线性布局,并在该线性布局中为中的每个迭代以编程方式添加文本视图

for (int i = 0; i < message.getMessages().size(); i++) {
    // display a different TextView for each different message...
}
for(int i=0;i

但是,由于膨胀是昂贵的,我建议将您的消息拆分为新行,并将它们全部添加到一个TextView中。

在您的数组中,当您在适配器中绘制时,为两个对话的人创建一个id,标识waths id is,并绘制与之对应的TextView,如下所示:

if (iduser.equals("1")){ textviewUser.setText("some text");}else{texviewOther.setText("sometext")} 

将动态文本视图添加到行中

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++;
    }
}

Spannable看起来是一个不错的选择,但我没有弄清楚如何将我的
message\u background.xml
应用为背景,甚至没有画出来(此xml文件基本上是一个带半径边框的矩形。Spannable有一个背景色选项,您可以使用它而不是可绘制的。如果您需要自定义可绘制的文字,那么是的,您必须膨胀大量TextView实例,或者为此创建自己的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++;
    }
}
<?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> 
mInflater = LayoutInflater.from(mContext);