在列表视图中添加单个开关

时间:2012-12-06 21:14:30

标签: java android listview switch-statement android-arrayadapter

我需要在我的ListView中添加一个开关(Android 4.0+),只需一个带有ImageView按钮的开关,我看过很多教程,教导在列表活动中添加几个视图,但我需要的只是一个具有此切换的列表的单个选项。我知道如果我可以放一个按钮或textView我可以在那里放一个开关,但是我无法理解如何在没有重复所有选项的相同场景的情况下放置按钮或任何视图,对我来说,我是ArrayAdapters和ListViews的新手,但我需要学习这两个,以便我以后可以使用它们!我需要的是这样的例子:

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

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

1 个答案:

答案 0 :(得分: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适配器中的方法。当连接到listView时,它将被识别为返回每个行的视图的方法。您看到的列表视图中的每一行都是此方法的一个已执行实例的乘积。你不要调用它:每当需要出现listview的行时,或者每当行位置移出屏幕并返回时,或者每当listView被刷新时,都会自动调用它,通常每当listview行必须被“制作”时”。它可以覆盖,以便您可以自定义所需的特定外观。

convertView也是一种观点。它是listview适配器中运行的名为 view-recycling 的并发机制的产物。想象一下,你有一个列表视图,需要为你的游戏购物菜单显示1000行。传统方法是,您只需为getView中的充满活力的xml创建一个inflate命令,然后编辑组件以显示项目差异。 所以,这是膨胀了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将使用已使用的视图填充它并将其插入(如果它被返回)。对于您的listview性能而言,这是一个最有益的动作,您可以立即执行此操作。

你应该知道这一点,这个网站上标记为android的问题大约有一半是在这个问题上,没有保证convertView会在你想要的位置上发挥作用,如右下方所示如果向下滚动,你会向上滚动并向上滚动只要确保你明确了什么位置,你会没事的。有关此以及其他listview专有技术的更多信息,请观看以下内容:http://www.youtube.com/watch?v=wDBM6wVEO70