0

リスト ビューのコンテンツを検索するときに、間違った項目が選択されているように見えるカスタム リストビューに問題があります。(以下のスクリーンショットを確認してください)

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

  1. 名前 aa で検索し、2 つの行 (AABBCCC と AABC) を選択しました

  2. Na で検索しましたが、行を選択しませんでした (Jana と Nathan)。しかし、それは選択されたものとして表示されています。

  3. すべての検索項目を削除し、検索を削除した後に行を選択しませんでした。2 つの行 (AABBCC と AABC) が表示されるはずですが、間違った行 Jana が表示されています。

上記の動作をオーバーライドする方法はありません。位置ではなく _rowid に基づいて連絡先をチェック可能にする必要があります。

リストで選択された項目を追跡するのはどのクラスですか? 上記の動作をオーバーライドするには??

名前と番号の 2 つの行があります。checkable を実装するレイアウト (以下のコード) をカスタマイズしました。

Search Name(EditText)        [Done Btn]
---------------------------------------
Contact_name_1         
Phone_no
---------------------------------------
Contact_name_2         
Phone_no2
---------------------------------------
Contact_name_3         
Phone_no3
---------------------------------------

チェック可能な項目を含むカスタム レイアウト..

public class CustomCheckableLists extends RelativeLayout implements Checkable {

 private Checkable mCheckable;

public CustomCheckableLists(Context context) {
    super(context);
}

public CustomCheckableLists(Context context, AttributeSet attrs)
{
    super(context,attrs);
}

public boolean isChecked() {
    return mCheckable == null ? false : mCheckable.isChecked();
    //return false;
}

public void setChecked(boolean checked) {
    if(mCheckable != null)
        mCheckable.setChecked(checked);


}

public void toggle() {
     if(mCheckable != null)
            mCheckable.toggle();
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();

    //Find items id..

    Log.w("onFinishInflate","onFinishInflate");

    // Find Checkable child
    int childCount = getChildCount();
    for (int i = 0; i < childCount; ++i) {
        View v = getChildAt(i);
        if (v instanceof Checkable) {
            mCheckable = (Checkable) v;
            break;
        }
    }
}

カスタム XML レイアウト

<CustomCheckableLists
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical" 
      android:orientation="horizontal"
    >

    <TextView 
    android:id="@+id/id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="name" 
    android:visibility="invisible"
    />

    <TextView 
    android:id="@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="nuoo" 
    />

    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/phonenu"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:checkMark="?android:attr/textCheckMark"
    android:gravity="center_vertical"
    android:paddingLeft="3dp"
    android:paddingRight="6dp"
    android:paddingTop="25dip"
    />

</CustomCheckableLists>

お問い合わせ アクティビティクラス

    String[] columns = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER
    };

    int[] to = new int[] {
            R.id.id,
            R.id.text1,
            R.id.phonenu
    };

    dataAdapter = new SimpleCursorAdapter(this, R.layout.custom_checkable_item, cursor, columns, to);
    listView.setAdapter(dataAdapter);

どんな助けでも大歓迎です。前もって感謝します。

編集

ユーザーが任意の名前を検索するたびに、検索結果を返すクエリが作成されます。以下のコード

 searchNameOrNumber = (EditText) findViewById(R.id.searchText);
    searchNameOrNumber.addTextChangedListener(new TextWatcher() 
    {
        public void onTextChanged(CharSequence searchterm, int start, int before, int count) {
            Log.w("Text Searched.. ", " " + searchterm);
            dataAdapter.getFilter().filter(searchterm.toString());
            //dataAdapter.notifyDataSetChanged();
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }
        public void afterTextChanged(Editable s) {
        }
    });

    dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            Log.w("Searched Query..,", constraint.toString());
            );


            return getSearchedContacts(constraint.toString());
        }
    });


public Cursor getSearchedContacts(String inputText)
{
    Log.w("inputText",inputText);
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.Contacts._ID, 
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                   ContactsContract.CommonDataKinds.Phone.NUMBER
        };
        String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like '%" + inputText + "%'";

        Cursor people = getContentResolver().query(uri, projection, selection, null, null);

        int indexName = people.getColumnIndex(StructuredName.DISPLAY_NAME);
        int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        int idIdx = people.getColumnIndexOrThrow(PhoneLookup._ID);

        if(!people.moveToFirst())
        {
            Log.w("No Cursor.., ","No cursor.., Cursor is empty..");
        }

        do {
            String id = people.getString(idIdx);
            String name   = people.getString(indexName);
            String number = people.getString(indexNumber);
            // Do work...
        } while (people.moveToNext());

        return people;


}
4

1 に答える 1

1

カスタムアダプタを作成し、そこでチェックされた項目を追跡する必要があります。この動作が見られる理由は、SimpleCursorAdapterがビューをリサイクルしていて、チェックされた状態を処理する方法がわからず、テキストラベルを設定するだけで、チェックされた状態を以前の状態のままにするためです。

この動作を確認するもう1つの方法は、画面一杯以上のアイテムを表示し、いくつかをチェックしてからスクロールすることです。スクロールすると、ランダムなアイテムがチェック/チェック解除されることにも気付くでしょう。

この回答で、これを機能させる方法の完全なサンプルを表示できます。

これを検索に使用している場合は、フィルタリングするたびに、チェックされている位置のリストをクリアする必要があります。

于 2012-12-22T07:39:30.080 に答える