Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从光标到LinearLayout的项目动态列表,不使用ListView_Android_Android Linearlayout_Android Cursoradapter - Fatal编程技术网

Android 从光标到LinearLayout的项目动态列表,不使用ListView

Android 从光标到LinearLayout的项目动态列表,不使用ListView,android,android-linearlayout,android-cursoradapter,Android,Android Linearlayout,Android Cursoradapter,我希望在列表中显示光标中的一些(5-ish)项目,并希望它与光标的内容保持同步(光标的内容反过来指向数据库),但我不希望使用ListView。相反,我希望填充一个普通的旧线性布局 我似乎明白我需要创建一个定制的CursorAdapter并重写newView()和bindView()方法。我不明白的是谁负责迭代游标的项(游标适配器是否执行此操作?我的代码是否应执行此操作?),如何将每个项目的视图设置为LinearLayout的父视图,以及谁负责为光标中的新项目创建新视图或删除不再通过光标可用的项目

我希望在列表中显示光标中的一些(5-ish)项目,并希望它与光标的内容保持同步(光标的内容反过来指向数据库),但我不希望使用ListView。相反,我希望填充一个普通的旧线性布局

我似乎明白我需要创建一个定制的CursorAdapter并重写newView()和bindView()方法。我不明白的是谁负责迭代游标的项(游标适配器是否执行此操作?我的代码是否应执行此操作?),如何将每个项目的视图设置为LinearLayout的父视图,以及谁负责为光标中的新项目创建新视图或删除不再通过光标可用的项目的视图

不知何故,我有一种预感,游标适配器已经完成了大部分工作,但我不能完全拼凑出拼图的所有部分。我是否在newView()中膨胀行布局并直接将其添加到LinearLayout?如果光标不再具有关联的数据,如何删除行

谢谢你的帮助


Manu

好吧,我会做以下几点:

  • 创建一个自定义类,一个LinearLayout的子类,使其变得简单。让我们称之为MyList
  • 将CursorAdapter实例传递给该类(例如,创建一个setAdapter方法)
  • 接收适配器时,MyList将注册数据更改(CursorAdapter.registerDataSetObserver)。当数据集更改时,调用“填充”方法
  • 接收适配器时,也可以直接调用“populate”以获取初始内容
  • 实现MyList.populate: **调用RemoveAllView **对于每个项目(遍历游标),调用addView(CursorAdapter.newView(getContext(),cursor,this))

简而言之就是这样。当然,稍后您可能希望对其进行优化,保留旧视图并改用CursorAdapter.bindView,这样您就不需要创建新的繁重java对象。

CursorAdapter允许您浏览大型列表,而无需将所有项加载到内存中。如果您只需要一小部分项目,那么我将在您的活动中迭代它们,并相应地更新视图(添加视图、设置文本值、显示/隐藏等)。

使用。当您的内容发生更改时,它将自动更新。

我以为是ListView负责不在内存中加载不必要的视图。当然,还有一个光标,在任何给定的时间,它在内部只指向一个项目。在这种情况下,CursorAdapter会做什么?所有适配器都提供ListView和数据之间的接口,将(可能的)大型列表虚拟化为一组小型的可查看列表项。CursorAdapter通过在查询结果中来回移动光标来实现这一点。如果您实际使用的是ListView,我可能仍然会使用CursorAdapter,因为它的连接非常简单,但是当您考虑将CursorAdapter与非ListView布局一起使用时,并且仅用于少数项目时,我就不会麻烦您了。谢谢。这似乎证实了我在对Pal的评论中表达的想法:考虑到显示自定义视图和/或自定义活动(如@Kurtis建议的活动)的项目数量很少,完全绕过CursorAdapter就足够了。这一切似乎都是合理的,但CursorAdapter是否已经有了一些迭代逻辑?我的意思是,在正常情况下,即使用ListView,何时调用getView()、newView()和bindView()?它不是在每个光标项目的基础上发生的吗?那么我是否应该重写这些方法呢?不,是ListView在迭代,因为ListView知道“查看窗口”,即可见的项集,所以ListView启动newView()或bindView()调用。为了加快速度,它会缓存视图。因此,它第一次创建视图时,必须调用newView()。然后,当视图不再可见时(用户滚动离开),它会将其移动到缓存中。然后,当另一个项目可见时,它将重用缓存中的项目,并调用bindView()仅更新视图中的数据。感谢您的澄清。这很有帮助。我想我对底层的架构选择仍然有点困惑。也就是说,为什么游标适配器(部分)负责视图?这不是ListView的全部能力吗?如果在ListView类中有newView()、getView()和bindView(),将其扩展并将光标直接传递给它,这样做是否更有意义?我想我不太理解为什么在扩展任何视图类时,中间的适配器会起作用。这个解决方案听起来简洁明了。在接下来的几天里,我将看到这种想法将我引向何方!很简单,事实上我已经编辑了我的回复以包括和示例!:)我确实尝试过这个解决方案,但它似乎制造了更多的问题。也就是说,我必须在onResume()中使用Cursor.requery(),因为我注册的内容观察者似乎只在活动运行时收到通知。但最终我也改变了UI设计,这将允许我再次使用ListAdapter和ListView。@manu3d我不知道我在想什么。我已经更新了我的答案,使之符合正确的做事方式。