我想这样做,以便用户可以搜索ListView检查所需的项目。我已经创建了一个没有搜索实现的可检查ListView。我尝试使用EditText和TextChangedListener添加搜索。这适用于普通的ListView,但由于此方法每次用户键入时都会创建一个新的适配器,因此检查的项目将丢失。
我的问题:
一个。在维护同一个适配器的同时,有什么方法可以搜索ListView吗?
B中。有没有办法使用我当前使用TextChangedListener但保持项目检查的方法?
答案 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的方法。