我尝试更改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
中特定项目的背景颜色?
希望你能帮助我。
答案 0 :(得分:0)
执行您尝试执行的操作的最简洁方法是编写自己的CursorAdapter支持两种视图类型:已激活的应用和已停用的应用。然后在getView
方法中,当您为视图充气时,可以相应地设置背景颜色。
有两种项目类型会使Android框架自动只将正确类型的视图转换为getView
,因此您需要在创建期间检查类型。
您可能会发现this answer有帮助。
在Android中,Adapter
用于将您的数据(在您的情况下从SQLite数据库)转换为可以在列表视图,微调器等中显示的View
。{{1} } 再具体一点)。最常用的一个是AdapterView
,当相关数据应该从游标中读取时,它具有必要的基本基础结构。
您的适配器主要需要三种方法:
- CursorAdapter
将告诉框架适配器知道多少类型的视图。对您而言,这将是两个:激活和停用的应用程序。
getViewTypeCount
,当传递数据中的特定位置(此处为:光标)时,能够决定该位置属于哪种类型。为此,您可能可以重复使用getItemViewType
代码,至少在大部分内容。
db.appActivated
,当传递位置时,可以将与该位置相关联的数据转换为getView
以供显示。让我们更深入地看一下最后一部分。
Android做了一些非常漂亮的东西,以确保您的应用程序快速,灵活和响应。其中一个原因是,它只会为列表中显示的所有位置保留足够的视图。所以,如果你有一个可以一次显示10个项目的列表,但是你的数据拥有一百万个记录,那么它仍然只能保留10个视图(实际上,从屏幕上滚动的东西还有一些,但绝对是不每个数据记录需要的一百万个)。
当实际将数据转换为可见的表示形式的时候 - View
- 它会传递一个旧的,先前可见但现在不在屏幕上的视图(循环视图)作为getView
参数尝试调整它以显示已重新使用的数据。这是因为膨胀新视图比仅仅采用现有视图并更改其文本或图像或其他任何内容相对更昂贵。您告诉它的视图类型将帮助它仅将转换视图的类型传递到convertView
,该视图适用于已请求的位置。
这样,如果传递的转换视图以某种方式不合适,则只需要扩展新视图。在这种情况下,不恰当的通常仅表示“如果它为空”。所以,通常情况下,你最终得到的是与此非常接近的东西:
getView
您可能希望观看this Google I/O keynote以获得有关它们如何结合在一起的更全面的解释。