如果你打算通过listview来做,那么你可以通过明确getView
适配器方法中的每个位置来做到这一点。这是一个例子:
public View getView(int position, View convertView, ViewGroup parent) {
switch (position) {
case 0:
// do image switch option
// convertView = layout 0
break;
case 3:
// do button whatever option
// convertView = layout 3
break;
case 5:
// do button whatever option
// convertView = layout 5
break;
default:
// do normal option
// convertView = layout 1
break;
}
return convertView;
}
getView
是许多 android 适配器中返回视图的方法。当连接到 alistView
时,它将被识别为为其每一行返回一个视图的方法。您看到的列表视图中的每一行都是该方法的一个执行实例的产物。您不会调用它:每当列表视图的行需要出现时,或者当行位置移出屏幕并返回时,或者当列表视图被刷新时,它都会自动调用,一般来说,只要列表视图行必须“制作” ”。您可以覆盖它,以便您可以自定义所需的特定外观。
convertView
也是一种观点。它是在 listview 适配器中运行的称为view-recycling的并发机制的产物。想象一下,您有一个需要为游戏的购物菜单显示 1000 行的列表视图。一种传统的方法是,您只需为您的 ingetView
制作一个充满活力的 xml 的膨胀命令,然后编辑组件以显示项目差异。所以,这膨胀了 1000 倍(并且膨胀是一个昂贵的步骤,请注意),再加上所有必须在内存中并且只会阻塞垃圾收集器的东西。另外,如果您需要刷新某些内容以显示更改怎么办?你出去!现在有四核手机,但有更好的方法。
正确完成的列表视图实际上并不会一次产生 1000 个视图,而是一次只能在屏幕上显示 7 或 8 个视图。当列表视图的行视图滚动到手机屏幕的边界之外时,它还没有被抛出。这个并发机制运行,这个视图被保存并保存在标题下,convertView
并作为下一次getView
调用的参数传入。不(重新)使用它是一种可怕的浪费,因为基本上你有一个看起来像下一个 getView 调用中的下一行的视图,也许只有 textview 中的文本发生了变化或类似的东西,但你会无论如何都要进行另一次昂贵的通货膨胀。然后未使用的 convertView 知道它的第二次机会已被忽略,进入 GC,并且一切照旧。
上面的代码没有使用convertView
,因为坦率地说,它没有在问题中被问到,但是使用起来非常简单。
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// inflation step
// convertView = inflation
}
// rest of code involving components of inflated view
return convertView;
}
首先,您检查那里是否没有任何东西,您可以想象这是第一次启动列表视图时,没有任何东西有机会被扔掉。然后才进行通货膨胀。下一次,getView 将满嘴都是用过的视图并将其插入(如果它被退回)。这是对您的列表视图性能最有利的操作,您可以立即执行此操作。
但是你应该知道这一点,这个网站上大约有一半的问题标记为 android 仅在这个问题上,不能保证 convertView 会在你想要的位置扑通一声,如果你向上滚动,就在下面,如果滚动,就在上面向下。只要确保你清楚地知道在什么位置上发生了什么,你就会没事的。有关此和其他 listview 专有技术的更多信息,请观看:http ://www.youtube.com/watch?v=wDBM6wVEO70 。