0

我试图更改ListView.

首先,从数据库中捕获它:

   ListAdapter adapter = new ArrayAdapter(getApplicationContext(),
            android.R.layout.simple_list_item_1, db.getAllApps());

    final ListView list = (ListView) findViewById(R.id.ListViewApps);

    list.setAdapter(adapter);

然后我会将所有应用程序设置为不同的颜色,如果它们激活了标签

// if app is activated in db --> set another colour in ListView
private void setAppCheck(ListView list) {

    List<String> apps = db.getAllApps();

    for (int i = 0; i < list.getCount(); i++) {
        if (db.appActivated(apps.get(i)).equals("activated")) {
            list.setBackgroundColor(0xffaaaaaa);  // it changes ALL items...

        } else {
            // do nothing
        }
    }
}

并且有问题,list.setItemChecked(i, true)我可以用特定位置更改它,但是如何更改特定项目的背景颜色ListView

希望您能够帮助我。

4

1 回答 1

0

做你想做的最干净的方法是编写自己的CursorAdapter支持两种视图类型:激活的应用程序和停用的应用程序。然后在您的getView方法中,当您膨胀视图时,您可以相应地设置背景颜色。

拥有两种项目类型将使 Android 框架仅自动将正确类型的转换视图传递给getView,因此您需要检查类型的唯一时间是在创建期间。

您可能会发现此答案很有帮助。

适配器基础知识

在 Android 中,Adapters 用于将您的数据(在您的情况下来自 SQLite 数据库)转换为View可以在列表视图、微调器等中显示的 s(AdapterView具体而言)。最常用的一种是CursorAdapter当关联数据应该从游标中读取时,它具有必要的基本基础结构。

您的适配器中主要需要三个方法:
-getViewTypeCount这将告诉框架您的适配器知道多少视图类型。对您来说,这将是两个:激活和停用的应用程序。

  • getItemViewType当传递数据中的特定位置(此处为光标)时,它能够确定该位置属于哪些类型。为此,您可能能够重用您的db.appActivated代码,至少在很大程度上是这样。

  • getView,当传递一个位置时,可以将与该位置关联的数据转换为View用于显示的数据。让我们更深入地看看最后一部分。

Android 做了一些非常漂亮的事情来确保您的应用程序快速、流畅且响应迅速。其中一件事是,它只会为列表中显示的所有位置保留足够的视图。因此,如果您有一个可以一次显示 10 个项目的列表,但您的数据包含一百万条记录,那么它仍然只会保留 10 个视图(实际上,从滚动到屏幕之外的内容时会多一些,但绝对而不是每条数据记录所需的一百万)。

当需要将数据实际转换为可见表示getView时 - 它会将一个旧的、以前可见但现在不在屏幕上的视图(回收视图)作为convertView参数传递给您,以尝试对其进行调整以显示已重新排队的数据。这是因为膨胀新视图比仅仅采用现有视图并更改其文本或图像或其他任何东西要昂贵得多。您告诉它的视图类型将帮助它仅将转换视图的类型传递给getView适合所请求位置的类型。

这样,您只需要在传递的转换视图以某种方式不合适的情况下膨胀新视图。而不恰当,在这种情况下,通常只意味着“如果它为空”。所以,通常,你最终得到的是非常接近这个的东西:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = // inflate a new view
    }
    // bind the convert view to the data, i.e. set its text views, images, and - in your case - background color
}

一个视频说了一千多个字

您可能想观看此 Google I/O 主题演讲,以更全面地了解这一切是如何联系在一起的。

于 2014-03-26T11:13:24.077 回答