Android搜索可检查ListView

时间:2012-07-26 06:34:53

标签: android listview search

我想这样做,以便用户可以搜索ListView检查所需的项目。我已经创建了一个没有搜索实现的可检查ListView。我尝试使用EditText和TextChangedListener添加搜索。这适用于普通的ListView,但由于此方法每次用户键入时都会创建一个新的适配器,因此检查的项目将丢失。

我的问题:

一个。在维护同一个适配器的同时,有什么方法可以搜索ListView吗?

B中。有没有办法使用我当前使用TextChangedListener但保持项目检查的方法?

1 个答案:

答案 0 :(得分:1)

您可以构建自己的类,其中包含listview elemnt的字段,并添加一个字段(isChecked)。重新创建适配器时,使用已创建的对象并保存已检查状态,并且在每行的getview中,您可以通过此属性检查\取消选中此项目

这是我的自定义复选框,您可以使用它并根据需要进行修改,我认为它可以满足您的需求(我从我的应用程序中获取此代码,您可以在this app中查看它的工作原理) :

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" />

将此视图添加到listview并创建setChecked方法(代码与onClick方法相同)。不要注意setParent和addViewToCheck方法 - 它们是在我的应用程序中控制UI的方法。