背景:我正在尝试在我的应用中实现一个消息系统,我正在编写一个自定义CursorAdapter
来显示ListView
中的消息聊天窗口。我想为传入和传出消息使用不同的行布局(保存在游标的SQLite行中的信息)。每行中具有相同ID的相同元素,但它们的排列方式不同。
问题:目前,我已覆盖newView()
和bindView()
。首次填充ListView
时,它会完美地创建所有View
,检查每一行以查看它是传入还是传出,并使正确的XML文件膨胀。但是,当我滚动或向窗口添加新消息时,适配器会回收View
个错误的行。我会覆盖getView()
,但它没有作为参数传递Cursor
,所以我无法知道该行是传入还是传出。
我不是在寻找代码,而是寻找优雅实现的一些建议。提前谢谢!
答案 0 :(得分:5)
以下是两种可能的解决方案:
(1)对所有项目使用单一布局,您可以在绑定时调整以根据需要显示。最直接的方法就是让根视图成为一个FrameLayout,其中包含每个不同状态的N个子节点,并且在绑定时使其中一个可见,所有其他节点都消失。当然,您要注意不要让它导致您的项目在其包含的视图数量中爆炸。
(2)实现Adapter.getItemViewType()http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)告诉列表视图你有不同类型的项目,以便它回收正确的项目。
答案 1 :(得分:0)
只是一些想法,我个人发现整个ListView
和CursorAdapter
组合有点......错误......正确的话是臃肿的吗?如果ScrollView
/ LinearLayout
组合只是按要求添加适当的TextView
会更简单吗?
但是对于您的解决方案,由于用户似乎无法在添加消息时更改消息的顺序,因此您可以向自定义ArrayList<String>
添加CursorAdapter
字段,以便跟踪消息是传入还是传出。类似的东西:
private ArrayList<String> cursorMonitor; //"incoming" and "outgoing" as your options.
...然后在ListView
填充的任何地方内部使用
cursorMonitor.add(my_cursor.getString("outgoing_or_incoming"));
然后在getView()
中,您可以覆盖它并使用cursorMonitor
来确定需要扩张的布局。