1

ユーザーが目的の項目をチェックして ListView を検索できるようにしたいと考えています。検索を実装せずに、チェック可能な ListView を既に作成しています。EditText と TextChangedListener を使用して検索を追加しようとしました。これは通常の ListView では正常に機能しますが、このメソッドはユーザーが入力するたびに新しいアダプターを作成するため、チェックされたアイテムは失われます。

私の質問:

A. 同じアダプターを維持しながら ListView を検索する方法はありますか?

B. TextChangedListener を使用する現在の方法を使用する方法はありますが、アイテムをチェックしたままにしますか?

4

1 に答える 1

1

リストビュー要素のフィールドで構成される独自のクラスを構築し、もう 1 つのフィールド (isChecked) を追加できます。アダプターを再作成すると、既に作成されているオブジェクトを使用し、チェックされた状態が保存され、各行の getview で、このプロパティでこの項目をチェック/チェック解除できます

これが私のカスタムチェックボックスです。必要に応じて使用して変更できます。目的に合うと思います(このコードをアプリからそのまま取得し、このアプリでどのように機能するかを確認できます):

package ru.human.notification;


import java.util.ArrayList;

import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckedTextView;

public class CustomCheckBox extends CheckedTextView
{

    private int CHECKED_IMAGE;
    private int UNCHECKED_IMAGE;
    private main_full parent;
    private ArrayList<View> viewsToCheck;
    private int msgType;

    public void setParent(main_full parent, int msgType)
    {
        this.parent = parent;
        this.msgType = msgType;
        setOnLongClickListener(longClickListner);
    }


    public void addViewToCheck(View view)
    {
        this.viewsToCheck.add(view);
    }


    OnLongClickListener longClickListner = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            if (parent != null && isChecked())
                parent.showTimeDialog(msgType);
            return true;
        }
    };

    OnClickListener listener = new OnClickListener()
    {

        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            if (!isChecked())
            {
                setTextColor(getResources().getColor(R.color.green));
                setPaintFlags(0);
                setChecked(true);
                setCheckMarkDrawable(CHECKED_IMAGE);
                if (parent != null)
                    parent.showTimeDialog(msgType);
            }
            else
            {
                setTextColor(getResources().getColor(R.color.lightgrey));
                setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
                setChecked(false);
                setCheckMarkDrawable(UNCHECKED_IMAGE);
            }
            for (View view: viewsToCheck)
                view.setVisibility(isChecked()?View.VISIBLE:View.GONE);
        }
    };

    public CustomCheckBox(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        setOnClickListener(listener);
        System.out.println("1");
        // TODO Auto-generated constructor stub
        // TODO mmmm

    }

    public CustomCheckBox(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        viewsToCheck = new ArrayList<View>();
        String xmlns="http://schemas.android.com/apk/res/ru.human.notification";
        setOnClickListener(listener);       
        System.out.println("2");
        int k = R.drawable.alarmgrey;
        CHECKED_IMAGE = attrs.getAttributeResourceValue(xmlns, "checkedImage", 404);
        UNCHECKED_IMAGE = attrs.getAttributeResourceValue(xmlns, "uncheckedImage", 404);
        setCheckMarkDrawable(UNCHECKED_IMAGE);
        setTextColor(getResources().getColor(R.color.lightgrey));
        setTextSize(18f);
        setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
//      setChecked(false);
        System.out.println(CHECKED_IMAGE +" " + UNCHECKED_IMAGE + " " +k);


        // TODO Auto-generated constructor stub
    }

    public CustomCheckBox(Context context)
    {
        super(context);
        final Context parent = context;
        System.out.println("3");
        // TODO Auto-generated constructor stub
        setOnClickListener(listener);
    }

}

attrs.xml:

</declare-styleable>


    <declare-styleable name="CustomCheckBox">
        <attr name="uncheckedImage" format="integer"/>
        <attr name="checkedImage" format="integer"/>
    </declare-styleable>

</resources>

利用方法:

<ru.human.notification.CustomCheckBox
                    android:id="@+id/delayed"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/settingsbutton"
                    android:checked="false"
                    customcheckbox:checkedImage="@drawable/clockcolor"
                    android:text="@string/delay"
                    customcheckbox:uncheckedImage="@drawable/clockgrey" />

このビューをリストビューに配置し、setChecked メソッドを作成します (コードは onClick メソッドと同じです)。setParent メソッドと addViewToCheck メソッドには注意を払わないでください。これらは、アプリで UI を制御する方法です。

于 2012-07-26T18:20:36.617 に答える