【问题标题】:change color of item in listview (without click)更改列表视图中项目的颜色(无需单击)
【发布时间】:2014-05-04 17:44:16
【问题描述】:

我已尝试更改 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 中特定项目的背景颜色?

希望你能帮助我。

【问题讨论】:

  • 使用Custom Adapter 并在getView 方法中更改。

标签: android listview background-color listviewitem setbackground


【解决方案1】:

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

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

您可能会发现this answer 很有帮助。

适配器基础知识

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

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

  • 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
}

一个视频说一千多个单词

您可能想观看this Google I/O keynote,以更全面地了解这一切如何联系在一起。

【讨论】:

  • 好的,我做不到。我不明白 :( 我读到 link 和你的提示,但我不知道它是如何工作的......
  • 谢谢,视频和解释都很棒,但我觉得我在这里是菜鸟。使用 setItemChecked 管理另一个解决方案...
  • 好的。通常,使用您完全理解的不太优雅的解决方案会比使用仅半理解的优雅解决方案更好,因此 IMO 您当时走对了路。不过,当您在 Android 上多花点功夫时,您可能想回来将其更改为您自己的适配器。最终,一旦你掌握了这个概念,它们就会赋予你很大的权力来控制数据的显示方式,同时将其与活动代码很好地分开。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
相关资源
最近更新 更多