3

SimpleAdapter によって入力されるアクティビティ (ListActivity ではない) に ListView があります。

public void updateGroupsInfoPane(){
    final ListView m_listview3 = (ListView) findViewById(R.id.memberOfList);
    mapMemberOfList.clear();
    for (String group : arrayAccountMemberOfList) {
        Map<String, Object> datum = new HashMap<String, Object>(2);
        String[] tempString = group.split(",");
        datum.put("groupname", tempString[0]);
        datum.put("groupdesc", tempString[1]);
        mapMemberOfList.add(datum);
    }
    SimpleAdapter adapter = new SimpleAdapter(this, mapMemberOfList, R.layout.membersof_list, new String[] {"groupname", "groupdesc"}, new int[] {android.R.id.text1, android.R.id.text2});
    m_listview3.setAdapter(adapter);

    m_listview3.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE);
    m_listview3.setTextFilterEnabled(true);

    m_listview3.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            CheckBox box = (CheckBox) view.findViewById(R.id.checkbox);
            TextView text1 = (TextView) view.findViewById(android.R.id.text1);
            String tempString = text1.getText().toString();

            if (box.isChecked()){
                box.setChecked(false);
                listCurrentMembership.remove(tempString);
            }else{
                box.setChecked(true);
                listCurrentMembership.add(tempString);
            };
        }
    });
}

これはうまくいきます。問題は、このリストをスクロールすると、チェックボックスが画面から外れて正しいものを再チェックしないようになり、次のスクロールの項目がチェックされることです。別の配列にロードすると、データは正しいです。チェックボックスのグラフィックだけが間違っています。スクロールしないと、チェックを入れたり外したりして、正しいデータを追加したり削除したりします。

これを検索するのは、ListView のリサイクルのためであり、getView を実装する必要があります。

私はしばらくの間、SimpleAdapter でこれを行う方法に関するかなりの数の例を見てきました。いくつかの投稿では、SimpleAdapter は既に getView を実行していると言っています。また、ListActivity を使用した他の例もあります。次に、ボックスをチェックする方法は、チェックボックス自体ではなく、ListViewアイテムをタップするだけです。しかし、私がやっていることに似ている例を見つけることができないので、遊んで修正することができます。

ListView 'membersof_list' の項目の XML は次のとおりです。

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vw1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<CheckBox android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:focusable="false"
android:clickable="false"
android:checked="false" />

<LinearLayout
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >

    <TextView android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
        android:layout_marginTop="8dip"
        android:ellipsize="end"
        android:textSize="8sp"
        android:textStyle="bold"
        android:singleLine="true"
    />
</LinearLayout>
<LinearLayout
    android:id="@+id/ll2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_below="@+id/ll1"
    >

    <TextView android:id="@android:id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
        android:ellipsize="end"
        android:textSize="6sp"
        android:singleLine="true"
    />
</LinearLayout>

新しい/異なるデータをロードする前にクリアする必要があるため、ListView に関連付けられている配列を空にします。データをコンマで分割して、groupname と groupdesc にロードします。デフォルトでは、チェックボックスはすべてオフになっています。

私は Android プログラミングの初心者であり、それが最もクリーンまたは最も効率的なコードではないことを知っていますが、機能するようになったら、これを再検討して改善する予定です。

提案、リンク、例は貴重です。ありがとう。

4

0 に答える 0