我正在开发一个类似于 WhatsApp 的应用程序,其中接收到的消息与左侧对齐,发送的消息与右侧对齐。
我应该如何使用 ListView 和 Adapters 将接收和发送的消息都保存在同一个 ListView 中?
我建议你创建一个 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;
}
您不需要两个适配器或列表视图。只需使用一个带有底层数据结构的适配器,当您发送或接收消息时,将消息附加到列表中,它就会显示出来。向消息类添加一个标志,说明它是发送还是接收,在这种情况下,自定义适配器可以正确对齐消息
如果你想在同一个列表视图上使用多个适配器,你可以使用 jeff Sharkey 分隔列表适配器http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/或者您可以像 edoardotognoni 所说的那样在您的自定义适配器中覆盖 getView 。
我认为你不可能有一个带有两个适配器的列表视图,但你可以创建一个适配器,覆盖 getView 方法并为每个项目定义一个布局,如果实际消息是接收到的消息,则左对齐,如果它是发送消息,对齐。
您可以使用单个Adapter
. 您需要研究的是Adapter的getItemViewType()
和getItemViewTypeCount()
方法。
适配器的支持数据应包含已发送和已接收的消息,并带有某种标志,以标识该消息是已发送消息还是已接收消息。
您getItemViewTypeCount()
应该返回 2,因为您将拥有两种类型的视图 - 一种是收到的聊天,另一种是发送的聊天。
在您的getView()
方法中,在膨胀视图之前,检查getItemViewType()
位置并为正确的视图膨胀并进行设置。您甚至可以重用 convertView。Android 将负责为您维护两个可重用视图池。