如何在基于Cursor数据的自定义CursorAdapter中使用不同的行布局?

时间:2011-06-04 01:45:36

标签: android listview android-cursoradapter

背景:我正在尝试在我的应用中实现一个消息系统,我正在编写一个自定义CursorAdapter来显示ListView中的消息聊天窗口。我想为传入和传出消息使用不同的行布局(保存在游标的SQLite行中的信息)。每行中具有相同ID的相同元素,但它们的排列方式不同。

问题:目前,我已覆盖newView()bindView()。首次填充ListView时,它会完美地创建所有View,检查每一行以查看它是传入还是传出,并使正确的XML文件膨胀。但是,当我滚动或向窗口添加新消息时,适配器会回收View个错误的行。我会覆盖getView(),但它没有作为参数传递Cursor,所以我无法知道该行是传入还是传出。

我不是在寻找代码,而是寻找优雅实现的一些建议。提前谢谢!

2 个答案:

答案 0 :(得分:5)

以下是两种可能的解决方案:

(1)对所有项目使用单一布局,您可以在绑定时调整以根据需要显示。最直接的方法就是让根视图成为一个FrameLayout,其中包含每个不同状态的N个子节点,并且在绑定时使其中一个可见,所有其他节点都消失。当然,您要注意不要让它导致您的项目在其包含的视图数量中爆炸。

(2)实现Adapter.getItemViewType()http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)告诉列表视图你有不同类型的项目,以便它回收正确的项目。

答案 1 :(得分:0)

只是一些想法,我个人发现整个ListViewCursorAdapter组合有点......错误......正确的话是臃肿的吗?如果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来确定需要扩张的布局。