0

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

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

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

4

2 回答 2

5

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

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

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

于 2011-06-04T03:40:00.317 回答
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来确定您需要膨胀的布局。

于 2011-06-04T02:21:24.350 回答