更改listview中的背景颜色(expandablelistview)

时间:2012-06-09 09:41:07

标签: android android-layout

我正在尝试动态更改listview的一部分中的backgroundcolor,我有一个在listview中正常工作的示例,当我尝试在另一个部分中使用可展开列表视图复制它时,它失败

如果学生在线或不在线,这段代码可以工作并显示不同的颜色

...

map.put(KEY_FIRSTNAME, temp.firstName);
map.put(KEY_NAME, temp.name);
map.put(KEY_EMAIL, temp.email);
map.put(KEY_ISONLINE, temp.isOnLine);

// change image if student is online or not
Log.d("demo", "is on line= " + temp.isOnLine);
if (temp.isOnLine.equalsIgnoreCase("1")) {
    map.put(KEY_IMAGE_ISONLINE, R.color.greenColor);
} else {
    map.put(KEY_IMAGE_ISONLINE, R.color.greyColor);
}
listItem.add(map);
}
myListView = (ListView) findViewById(R.id.listViewTabLeerlingen);

SimpleAdapter adapter = new SimpleAdapter(StudentTab.this,
    listItem,
    R.layout.list_item_student,
    new String[] { KEY_FIRSTNAME, KEY_NAME,
    KEY_IMAGE_ISONLINE }, new int[] {
    R.id.firstNameTextView,
    R.id.lastNameTextView,
    R.id.logo });
    myListView.setAdapter(adapter);

随之而来的xml

<ImageView
            android:id="@+id/logo"
            android:layout_width="85dp"
            android:layout_height="match_parent"
            android:background="@color/greenColor"
            android:contentDescription="Image if student is online or not"
            android:src="@drawable/transparent_pixel" />

以上工作正常,但以下代码(只是代码的一部分)

...

ArrayList<Map<String, Object>> children = new ArrayList<Map<String, Object>>();
for (int i = 0; i < _data.length(); i++) {
try {   
   JSONArray tmp = _data.getJSONArray(i);
        HashMap<String, Object> map = new HashMap<String, Object>();

    // change image if student is online or not
    if (tmp.getString(3).equalsIgnoreCase("0")) {
        map.put(KEY_POINTS,R.color.redColor);
    }else{
        map.put(KEY_POINTS,R.color.greenColor);
    }
        map.put(KEY_QUESTIONTEXT, tmp.getString(1)); 
        map.put(KEY_ANSWER, tmp.getString(2));
        children.add(map);
    } 
catch (JSONException e) {
    e.printStackTrace();
}
childData.add(children);

...

...

ArrayList<ArrayList<Map<String, Object>>> childData) {
            SimpleExpandableListAdapter listAdapter = new SimpleExpandableListAdapter(
                    this, groupData, R.layout.list_item_results_students,
                    new String[] { KEY_FIRSTNAME, KEY_NAME, KEY_ISJUIST },
                    new int[] { R.id.firstnameResults, R.id.nameResults,
                            R.id.resultsTextView }, childData,
                    R.layout.list_item_results_results, new String[] {
                            KEY_QUESTIONTEXT, KEY_ANSWER, KEY_POINTS }, new int[] {
                            R.id.questionTextView, R.id.answerTextTextView, R.id.score });
            ExpandableListView myListView = (ExpandableListView) findViewById(R.id.listViewTabResultaten);
            myListView.setAdapter(listAdapter);

使用xml:

<ImageView
        android:id="@+id/score"
        android:layout_width="16dp"
        android:layout_height="match_parent"
        android:background="@color/greenColor"
        android:contentDescription="Image if student has correct answer"
        android:src="@drawable/transparent_pixel" />

我会收到此错误:

06-09 10:35:21.490:E / AndroidRuntime(4406):java.lang.ClassCastException:android.widget.ImageView无法强制转换为android.widget.TextView

3 个答案:

答案 0 :(得分:1)

SimpleExpandableListAdapter州的文档

  

childTo应在“childFrom”中显示列的子视图   参数。这些都应该是TextViews。这是前N个观点   列表被赋予childFrom中前N列的值   参数。

因此SimpleExpandableListAdapter只接受TextView类。 文档对SimpleAdapter说明相同,但查看源代码(例如SimpleAdapter.bindView()),您可以看到它们还检查ImageView和其他类型。

因此,您的第一个示例有效,但第二个示例抛出ClassCastException

要解决此问题,您可以覆盖此StackOverflow question

中显示的SimpleExpandableListAdapter行为

答案 1 :(得分:0)

在SimpleExpandableListAdapter的构造函数中,childTo参数包含ImageView项,@ + id / score。 childTo数组应仅包含TextViews。您正在尝试为图像指定颜色int。

SimpleExpandableListAdapter Reference

上面的SimpleAdapter实际上也是如此,你使用@ + id / logo。

Simple Adapter Reference

答案 2 :(得分:0)

参数

context正在运行与此SimpleExpandableListAdapter关联的ExpandableListView的上下文 groupData地图列表。列表中的每个条目对应于列表中的一个组。地图包含每个组的数据,并应包含“groupFrom”中指定的所有条目 groupLayout视图布局的资源标识符,用于定义组的视图。布局文件应至少包含“groupTo”中定义的那些命名视图 groupFrom将从与每个组关联的Map中提取的键列表。 groupTo应在“groupFrom”参数中显示列的组视图。这些都应该是TextViews。此列表中的前N个视图将获得groupFrom参数中前N列的值。 childData地图列表的列表。外部列表中的每个条目对应一个组(按组位置索引),内部列表中的每个条目对应于组内的子项(按子项位置索引),而Map对应于子项的数据(索引由childFrom数组中的值)。 Map包含每个子项的数据,并应包含“childFrom”中指定的所有条目 childLayout定义子视图的视图布局的资源标识符。布局文件应至少包含“childTo”中定义的那些命名视图 childFrom将从与每个子项关联的Map中获取的键列表。 childTo应在“childFrom”参数中显示列的子视图。这些都应该是TextViews。此列表中的前N个视图将获得childFrom参数中前N列的值。

在SimpleExpandableListAdapter.java的源代码中,你会发现:

private void bindView(View view,Map data,String [] from,int [] to){         int len = to.length;

    for (int i = 0; i < len; i++) {
        TextView v = (TextView)view.findViewById(to[i]);
        if (v != null) {
            v.setText((String)data.get(from[i]));
        }
    }
}