1

テキストボックスや各リスト項目ListViewなどの要素を含むアプリで を使用しています。CheckBox最初のテキストボックスを埋めると、7番目のテキストボックスまたは他のランダムなテキストボックスに同じ値が自動的に入力され、 CheckBoxチェックする と、他のランダムなCheckBoxも自動的にチェックされますCheckBox

なぜそれが起こるのか理解できません。

以下の私のコード:

リストビューのコンテンツ

<!--- add your MY problem code comment -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/hyList"
    android:layout_width="fill_parent"
    android:layout_height="35sp"
    android:layout_gravity="top"
    android:orientation="horizontal" >

    <TableLayout
        android:id="@+id/tbltab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="100" >    
        <TableRow
            android:id="@+id/rowfooter"
            android:layout_width="fill_parent"
            android:layout_height="35sp"
            android:gravity="center_horizontal|bottom" >    
            <TextView
                android:id="@+id/txt_Hy_ID"
                android:layout_width="0sp"
                android:layout_height="35sp"
                android:textSize="1pt" >
            </TextView>    
            <TextView
                android:id="@+id/txt_HyID"
                android:layout_width="0sp"
                android:layout_height="35sp"
                android:textSize="1pt" >
            </TextView>    
            <TextView
                android:id="@+id/txt_Hy_Area"
                android:layout_width="200sp"
                android:layout_height="35sp"
                android:layout_gravity="center_vertical"
                android:gravity="left"
                android:textSize="8pt" >
            </TextView>    
            <CheckBox
                android:id="@+id/chkHyCondition"
                android:layout_width="60sp"
                android:layout_height="35sp"
                android:layout_gravity="center"
                android:saveEnabled="true" />    
            <EditText
                android:id="@+id/editTxtHyRemarks"
                android:layout_width="120sp"
                android:layout_height="35sp"
                android:layout_gravity="center_vertical|left"
                android:gravity="center_vertical|left"
                android:maxLength="25"
                android:saveEnabled="true"
                android:textSize="8pt" >
            </EditText>
        </TableRow>
    </TableLayout>    
</LinearLayout>

とリストビュー

<ListView
   android:id="@+id/ListViewHy"
   android:layout_width="420sp"
   android:layout_height="100sp"
   android:layout_column="0"
   android:layout_span="3"
   android:clickable="true"
   android:saveEnabled="true"
   android:scrollbarSize="10sp"
   android:scrollbars="vertical" >
   </ListView>

これを使用してリストビューをバインドしています:

private void FillGridHygiene() {
    LstViewHy = (ListView) findViewById(R.id.ListViewHy);
    clsDatabase dbh = new clsDatabase(this);
    dbh.openDataBase();
    Cursor cursor;
    cursor = dbh.getGridData("030");
    dbh.close();
    if (cursor != null) {
        int cnt = cursor.getCount();
        if (cnt > 0) {
            startManagingCursor(cursor);
            try {
                // -----------BindingListView----------------------------------------------------------------------------

                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                        R.layout.hygiene_list, cursor, new String[] {
                                Audit_FSD_Tab.KEY_ROW_ID,
                                Audit_FSD_Tab.KEY_ID,
                                Audit_FSD_Tab.KEY_SHORT_NAME }, new int[] {
                                R.id.txt_Hy_ID, R.id.txt_HyID,
                                R.id.txt_Hy_Area });
                adapter.setViewResource(R.layout.hygiene_list);
                LstViewHy.setAdapter(adapter);
                LstViewHy.setTextFilterEnabled(true);
                LstViewHy.setFocusable(false);
                LstViewHy.setVisibility(View.VISIBLE);

            } catch (Exception ex) {
                ex.fillInStackTrace();
            }
        }

    }
}

編集:1

API レベル - 7 バージョン - 2.1

4

2 に答える 2

3

問題は、リストビューの設計にあります。カスタム アダプターを作成し、view holder と convertview を使用してビューをリサイクルする必要があります。Listview baseadapterを使用したリスト ビュー

これは、ListView の概念を理解するのに役立ち、その理由を理解するのに役立ちます。他のランダムなテキスト ボックスには同じ値が自動的に入力され、チェックボックスをオンにすると、他のランダムなチェックボックスも自動的にオンになります。これがあなたを助け、リストビューの設計に役立つことを願っています

于 2012-05-18T11:47:41.280 に答える
1

他の人が言ったようAdapterに、bindView. Adapter以下は、状態を格納するの簡単な例です。

public class CustomAdapter extends SimpleCursorAdapter {

            // this will hold a mapping between the row ids and a special object that  will store the values for the EditText and CheckBox
    private HashMap<Long, StateSaver> status = new HashMap<Long, StateSaver>();

    public CustomAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
                    // get th id of the this row so we can use it as an identifier
        long theId = cursor.getLong(cursor.getColumnIndex("_id"));
        CheckBox ckb = (CheckBox) view.findViewById(R.id.checkBox1);
        ckb.setTag(new Long(theId));
                    // store the status of the CheckBox when it changes
        ckb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                Long theRealId = (Long) buttonView.getTag();
                StateSaver obj = status.get(theRealId);
                if (obj == null) {
                    obj = new StateSaver();
                    status.put(theRealId, obj);
                }
                obj.checked = isChecked;
            }
        });
        EditText et = (EditText) view.findViewById(R.id.editText1);
        et.setTag(new Long(theId));
                    // when the EditText losses focus it's time to store the value entered by the user
        et.setOnFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(!hasFocus) {
                    Long theRealId = (Long) v.getTag();
                    StateSaver obj = status.get(theRealId);
                    if (obj == null) {
                        obj = new StateSaver();
                        status.put(theRealId, obj);
                    }
                    obj.currentInput = ((EditText) v).getText().toString();
                }
            }
        });
        StateSaver sv = status.get(theId);
        // setup the row with the correct data, either the default or what you've previously stored
        if (sv == null) {
            ckb.setChecked(false);
            et.setText("");
        } else {
            ckb.setChecked(sv.checked);
            et.setText(sv.currentInput);
        }

    }

    private class StateSaver {
        boolean checked = false;
        String currentInput = "";
    }

}

また、 を含む に設定する必要がandroid:windowSoftInputMode="adjustPan"ありActivityますListView

私のアドバイスはEditTextListView連続して使用しないことです。また、行のレイアウトを改善してみてください:sp単位はテキスト サイズにのみ使用し (dp他の場所では代わりに使用してください)、単位を使用しないでください。属性ptが本当に必要かどうかなどを確認してください。layout_weight

于 2012-05-18T13:57:10.767 に答える