0

我正在尝试在列表视图的一部分中动态更改背景颜色,我有一个示例,当我尝试使用可扩展列表视图将其复制到另一部分时,它在列表视图中运行良好,但它失败了

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

...

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

4

3 回答 3

1

SimpleExpandableListAdapter各州的文档

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

所以SimpleExpandableListAdapter唯一接受的TextView类。文档SimpleAdapter中对. _ImageView

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

要修复它,您可以覆盖此旧StackOverflow 问题SimpleExpandableListAdapter中所示的行为

于 2012-06-09T10:37:33.790 回答
0

在 SimpleExpandableListAdapter 的构造函数中,childTo 参数包含您的 ImageView 项目,@+id/score。childTo 数组应该只包含 TextViews。您正在尝试将颜色 int 分配给图像。

SimpleExpandableListAdapter 参考

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

简单适配器参考

于 2012-06-09T10:15:32.677 回答
0

参数

context 与此 SimpleExpandableListAdapter 关联的 ExpandableListView 正在运行的上下文 groupData 一个地图列表。列表中的每个条目对应于列表中的一个组。Maps 包含每个组的数据,并且应该包括定义组视图的视图布局的“groupFrom”groupLayout 资源标识符中指定的所有条目。布局文件应至少包括在“groupTo”中定义的命名视图 groupFrom 将从与每个组关联的 Map 中获取的键列表。groupTo 应该在“groupFrom”参数中显示列的组视图。这些都应该是 TextViews。此列表中的前 N ​​个视图被赋予 groupFrom 参数中前 N 列的值。childData 地图列表列表。外部List中的每个条目对应一个组(按组位置索引),内部列表中的每个条目对应于组内的一个子项(按子位置索引),Map对应一个子项的数据(按组位置索引) childFrom 数组中的值)。Map 包含每个孩子的数据,并且应该包括定义孩子视图的视图布局的“childFrom”childLayout 资源标识符中指定的所有条目。布局文件应至少包括在“childTo”中定义的命名视图 childFrom 将从与每个孩子关联的 Map 中获取的键列表。并且 Map 对应于孩子的数据(按 childFrom 数组中的值索引)。Map 包含每个孩子的数据,并且应该包括定义孩子视图的视图布局的“childFrom”childLayout 资源标识符中指定的所有条目。布局文件应至少包括在“childTo”中定义的命名视图 childFrom 将从与每个孩子关联的 Map 中获取的键列表。并且 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]));
        }
    }
}
于 2012-06-09T10:41:14.320 回答