0

我需要在我的 ListView 中添加一个开关(Android 4.0+),只是一个带有 ImageView Button 的开关,我已经看过很多教程,教在列表活动中添加多个视图,但我需要的只是一个选项有这个开关的列表。我知道我是否可以放一个按钮或 textView 我可以放一个开关在那里,但我不明白如何放一个按钮或任何视图而不在所有选项上重复整个相同的场景,至于我,我是ArrayAdapters 和 ListViews 的新手,但我需要学习这两个,以便以后可以使用它们!我需要的是这样的,例如:

______________________
Image  |  Switch 
______________________
Normal option
______________________
Button | Whatever view
_______________________
Normal option
_______________________
Checkable Option
_______________________

等等......所以如果你清楚,我想完全控制那里的每一个选项,这就是我需要和想要的。谢谢你的帮助 :)

4

1 回答 1

2

如果你打算通过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 。

于 2012-12-06T23:27:55.223 回答