Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.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 Listview:更新不可见视图或禁用回收_Android_Listview_Android Listview_Android Scrollview - Fatal编程技术网

Android Listview:更新不可见视图或禁用回收

Android Listview:更新不可见视图或禁用回收,android,listview,android-listview,android-scrollview,Android,Listview,Android Listview,Android Scrollview,我正在设计一款android游戏,我正在尝试使用ListView。该列表使用BaseAdapter,并用ArrayList填充。当用户按下ok按钮时,我滚动到列表顶部,然后遍历列表中的每个士兵。我将士兵的一个子视图的背景设置为可绘制,以便它是一个显示“命中”或“未命中”的短动画。我使用了一个Handler.postdayed(),这样每个动画都可以在它之前完成 问题是我无法修改不可见的视图。我的列表中一次最多有13名士兵,但最多只能显示5名。因此,一旦我击中第六名士兵,我就会从使用ListVie

我正在设计一款android游戏,我正在尝试使用ListView。该列表使用BaseAdapter,并用ArrayList填充。当用户按下ok按钮时,我滚动到列表顶部,然后遍历列表中的每个士兵。我将士兵的一个子视图的背景设置为可绘制,以便它是一个显示“命中”或“未命中”的短动画。我使用了一个Handler.postdayed(),这样每个动画都可以在它之前完成

问题是我无法修改不可见的视图。我的列表中一次最多有13名士兵,但最多只能显示5名。因此,一旦我击中第六名士兵,我就会从使用ListView.getChildAt(soldierArrayIndex)中得到一个空指针异常。我的解决方案是在getChildAt()调用之前添加smoothScrollTo(soldierArrayIndex),使其可见,但问题仍然存在

所以我的问题不是“如何修复我的代码?”。我更想知道是否有一种方法可以像ListView那样禁用回收。我使用getChildAt()的原因是,我需要对它返回的视图使用findViewById(),然后修改由ID找到的视图。但是,如果该视图从未被回收,getChildAt()将不会返回null

我的另一个想法是只使用滚动视图,输入我创建的士兵视图的13个实例,然后将我当前未使用的实例设置为“gone”。我唯一的问题是我不知道如何遍历这些视图


TL;DR:如何更新listview中当前不可见的视图(它们当前被“回收”)?

我认为您在这里混淆了模型和视图

适配器视图使用通常可以访问整个数据集的适配器。因此,即使ListView只呈现屏幕上可见的项目,您仍然可以通过调用适配器上的getItem(position)来访问屏幕外项目

看起来您是在适配器上直接调用getView

我建议您不要这样做,因为AdapterViews和适配器不是这样设计的。相反,当模型中的某些内容发生更改时,您需要向ListView指示(通过notifyDataSetChanged),并让ListView代表您调用适配器的getView方法

我想象事件的顺序是这样的:

  • 更新士兵对象
  • 在适配器上调用notifyDataSetChanged,它将告诉ListView需要重新绘制内容
  • ListView通过调用getView(int-position、View-convertView、ViewGroup-parent)遍历每个节点上的可见士兵项
  • 适配器中的getView实现在指定位置获取士兵,并确定视图在该时间点的外观
  • 对于“屏幕外”士兵(在ListView的滚动区域中不可见的士兵),ListView不需要渲染他们,因此不会在这些位置调用getView

    但是,如果屏幕外的士兵现在滚动到视图中,ListView将使用该士兵在阵列中的位置调用适配器的getView方法


    最后,如果您希望对AdveldVIEW如何更新自己进行细粒度的控制,您可以考虑RealeReVIEW,因为它允许您逐项地通知更改。

    我有一个AARAYLIST,用作适配器从中拔出的源。arrayList由士兵对象组成。当我执行getView()时,我会拉取一个士兵对象并用他的数据填充视图。然后,当他受到攻击时,我修改他的视图,使其显示动画。问题是,当我调用getItem()时,我没有得到他的视图,我得到的是士兵对象本身。据我所知,我无法手动调用getView()。想法?@JakeMarzen:请看上面我编辑的答案。我希望这有助于澄清问题。