每个ListView行中的重力不同

时间:2015-08-07 13:44:10

标签: android android-listview

我有ListView代表两个人之间的消息。我正在尝试根据发件人将Gravity设置为LEFTRIGHT(例如 me / 他们)。

这就是我目前正在做的事情:

conversationListAdapter.add(message,true/*me*/);

conversationListAdapter.add(message,false/*them*/);

在适配器中:

public void add(String object , boolean fromMe) {
    super.add(object);
    this.fromMe = fromMe;
}

fromMe是适配器本身的变量。

andisde getView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {...}
String entry = conversationList.get(position);
if(entry != null) {
    ViewHolder holder = (ViewHolder)convertView.getTag();
    if(fromMe) {
        holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
    }
    else {
        holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    }
    holder.message.setText(entry);
}

当我发送消息时,所有行都将其重力设置为RIGHT,当我收到消息时,他们都将重力设置为LEFT

如何为每行独立完成此操作?

我想也许可以将变量移到holder?但那我该如何分配呢?

或者有2个不同的行(一个有LEFT重力,一个有RIGHT重力),并相应地给它们充气?

修改

xml行:

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/chat_convo_row_textview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

3 个答案:

答案 0 :(得分:1)

使用Seperate类存储如下数据。

public class ChatMessages{
    private String message;
    private boolean isMe;

    public ChatMessages(String message, boolean isMe){
      this.message=message;
      this.isMe=isMe;
}
}

将每个项目值存储在此Chatmessages对象中并进行检索

那你就没事了。

答案 1 :(得分:0)

我假设这与您的适配器中的fromMe变量有关。您的add()方法可能会导致ListView重绘,所有这些都使用相同的fromMe变量。

因此,您需要使用每条消息存储各个发件人。我假设你现在正在使用List<String>数据结构,你需要找到一种方法来存储每个String的发送者。一种方法是为消息创建一个类。

伪代码示例:

class Message{
    public boolean sentFromMe;
    public String message;
    public Message(String message, boolean sentFromMe){
        this.sentFromMe = sentFromMe;
        this.message = message;
    }
}

然后在List<Message>

中创建getView()
Message entry = conversationList.get(position);
if(entry != null) {
    ViewHolder holder = (ViewHolder)convertView.getTag();
    if(entry.sentFromMe) {
        holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
    }
    else {
        holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    }
    holder.message.setText(entry.message);
}

答案 2 :(得分:0)

你可以创建一个代表列表项的类。 XML很好。

该课程可能如下所示:

public class ConversationLine {

    public final String message;
    public final boolean sentByMe;

    public ConversationLine(String message, boolean sentByMe) {
        this.message = message;
        this.sentByMe = sentByMe;
    }

}

使用ArrayAdapter,如下所示:

public class ConversationAdapter extends ArrayAdapter<ConversationLine> {

    public EndpointAdapter(Context context, List<ConversationLine> conversationLines) {
        super(context, R.layout.your_layout, conversationLines);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Holder holder;

        if(convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.your_layout, parent, false);
            holder = new Holder();
            holder.message = (TextView) convertView.findViewById(R.id.chat_convo_row_textview;
            convertView.setTag(holder);
        } else {
            holder = (Holder) view.getTag();
        }

        ConversationLine entry = conversationList.get(position);
        if(entry != null) {
            if(entry.sentByMe) {
                holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
            }
            else {
                holder.message.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            }
            holder.message.setText(entry);
        }
    }

    private static class Holder {

        final TextView message;
    }
}

然后,您可以使用ArrayAdapter的标准add()方法将项​​添加到适配器。

注意:此代码可能无法正确编译,手写;)

编辑:改进了代码,忘记将TextView分配给Holder.message