我有ListView
代表两个人之间的消息。我正在尝试根据发件人将Gravity
设置为LEFT
或RIGHT
(例如 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" />
答案 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