2

我正在开发一个类似于 WhatsApp 的应用程序,其中接收到的消息与左侧对齐,发送的消息与右侧对齐。

我应该如何使用 ListView 和 Adapters 将接收和发送的消息都保存在同一个 ListView 中?

4

5 回答 5

2

我建议你创建一个 Message 类。这个类有一个布尔值,例如boolean sent;

因此,如果它是真的,您就知道它是您发送的。

当您为列表视图创建自定义适配器时,您可以执行以下操作:

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext()
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    convertView = inflater.inflate(R.layout.rowcustom, null);
    Message msg = getItem(position)

    if (msg.isSent()) {
    // Message is sent
    }
    else {
    // Message is received

    }

    return convertView;
}
于 2013-05-02T15:57:07.763 回答
1

您不需要两个适配器或列表视图。只需使用一个带有底层数据结构的适配器,当您发送或接收消息时,将消息附加到列表中,它就会显示出来。向消息类添加一个标志,说明它是发送还是接收,在这种情况下,自定义适配器可以正确对齐消息

于 2013-05-02T15:56:08.153 回答
1

如果你想在同一个列表视图上使用多个适配器,你可以使用 jeff Sharkey 分隔列表适配器http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/或者您可以像 edoardotognoni 所说的那样在您的自定义适配器中覆盖 getView 。

于 2013-05-02T16:25:15.257 回答
0

我认为你不可能有一个带有两个适配器的列表视图,但你可以创建一个适配器,覆盖 getView 方法并为每个项目定义一个布局,如果实际消息是接收到的消息,则左对齐,如果它是发送消息,对齐。

于 2013-05-02T15:58:59.330 回答
0

您可以使用单个Adapter. 您需要研究的是AdaptergetItemViewType()getItemViewTypeCount()方法。

适配器的支持数据应包含已发送和已接收的消息,并带有某种标志,以标识该消息是已发送消息还是已接收消息。

getItemViewTypeCount()应该返回 2,因为您将拥有两种类型的视图 - 一种是收到的聊天,另一种是发送的聊天。

在您的getView()方法中,在膨胀视图之前,检查getItemViewType()位置并为正确的视图膨胀并进行设置。您甚至可以重用 convertView。Android 将负责为您维护两个可重用视图池。

于 2013-05-02T17:38:56.573 回答