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」パラメーターで列を表示する必要がある子ビュー。これらはすべて TextView である必要があります。このリストの最初の N ビューには、childFrom パラメータの最初の N 列の値が与えられます。

したがって、SimpleExpandableListAdapterのみがクラスを受け入れますTextView。ドキュメントには についても同じことSimpleAdapterが記載されていますが、ソース コード (例: SimpleAdapter.bindView() ) を見ると、ImageViewおよび他のタイプもチェックしていることがわかります。

したがって、最初の例は機能しましたが、2 番目の例ではClassCastException.

SimpleExpandableListAdapterそれを修正するには、この古いStackOverflow questionに示されているような動作をオーバーライドできます

于 2012-06-09T10:37:33.790 に答える
0

パラメーター

context この SimpleExpandableListAdapter に関連付けられた ExpandableListView が実行されているコンテキスト groupData マップのリスト。リスト内の各エントリは、リスト内の 1 つのグループに対応します。マップには各グループのデータが含まれており、グループのビューを定義するビュー レイアウトの "groupFrom" groupLayout リソース識別子で指定されたすべてのエントリを含める必要があります。レイアウト ファイルには、少なくとも「groupTo」で定義された名前付きビューが含まれている必要があります。 groupFrom 各グループに関連付けられたマップから取得されるキーのリスト。groupTo 「groupFrom」パラメーターで列を表示する必要があるグループ ビュー。これらはすべて TextView である必要があります。このリストの最初の N 個のビューには、groupFrom パラメータの最初の N 列の値が与えられます。childData マップのリストのリスト。外側のリストの各エントリはグループ (グループ位置によるインデックス) に対応し、内側のリストの各エントリはグループ内の子 (子の位置によるインデックス) に対応し、マップは子のデータ (インデックスによるインデックス) に対応します。 childFrom 配列の値)。Map には各子のデータが含まれており、子のビューを定義するビュー レイアウトの「childFrom」childLayout リソース識別子で指定されたすべてのエントリを含める必要があります。レイアウト ファイルには、少なくとも「childTo」で定義された名前付きビューを含める必要があります。 childFrom 各子に関連付けられたマップから取得されるキーのリスト。Map は子のデータに対応します (childFrom 配列の値によるインデックス)。Map には各子のデータが含まれており、子のビューを定義するビュー レイアウトの「childFrom」childLayout リソース識別子で指定されたすべてのエントリを含める必要があります。レイアウト ファイルには、少なくとも「childTo」で定義された名前付きビューを含める必要があります。 childFrom 各子に関連付けられたマップから取得されるキーのリスト。Map は子のデータに対応します (childFrom 配列の値によるインデックス)。Map には各子のデータが含まれており、子のビューを定義するビュー レイアウトの「childFrom」childLayout リソース識別子で指定されたすべてのエントリを含める必要があります。レイアウト ファイルには、少なくとも「childTo」で定義された名前付きビューを含める必要があります。 childFrom 各子に関連付けられたマップから取得されるキーのリスト。 childTo 「childFrom」パラメーターで列を表示する必要がある子ビュー。これらはすべて TextView である必要があります。このリストの最初の 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 に答える
0

SimpleExpandableListAdapter のコンストラクターでは、childTo 引数に ImageView アイテム @+id/score が含まれます。childTo 配列には、TextView のみを含める必要があります。画像に色 int を割り当てようとしています。

SimpleExpandableListAdapter リファレンス

上記の @+id/logo を使用する SimpleAdapter についても、実際には同じことが当てはまります。

簡単なアダプターのリファレンス

于 2012-06-09T10:15:32.677 に答える