过滤listview上的自定义适配器在android中无法正常工作?
我有一个数组适配器,如下所示。我已经实现了一个Filterable,但是当我输入EditText时,什么也没有发生过滤listview上的自定义适配器在android中无法正常工作?,android,listview,filtering,android-filterable,Android,Listview,Filtering,Android Filterable,我有一个数组适配器,如下所示。我已经实现了一个Filterable,但是当我输入EditText时,什么也没有发生 public class CustomAdapter extends ArrayAdapter<Custom> implements Filterable{ private ArrayList<Custom> entries; private Activity activity; private Context context;
public class CustomAdapter extends ArrayAdapter<Custom> implements Filterable{
private ArrayList<Custom> entries;
private Activity activity;
private Context context;
private qrusers qrusers;
CustomFilter customFilter;
private String[] udis;
ArrayList<String> userid= new ArrayList<String>();
boolean[] checkBoxState;
LayoutInflater vi;
public CustomAdapter(Context context, ArrayList<Custom> entries,String []udis) {
super(context,0,entries);
this.entries = entries;
this.context= context;
this.udis=udis;
checkBoxState=new boolean[entries.size()];
this.qrusers =(qrusers) context;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public static class ViewHolder{
public TextView item1;
public TextView item2;
public CheckBox chek;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
v = vi.inflate(R.layout.checkboxlist, null);
holder = new ViewHolder();
holder.item1 = (TextView) v.findViewById(R.id.contactname);
holder.item2 = (TextView) v.findViewById(R.id.companyname);
holder.chek=(CheckBox)v.findViewById(R.id.checboxlist);
v.setTag(holder);
}
else{
holder=(ViewHolder)v.getTag();
}
holder.chek.setChecked(checkBoxState[position]);
holder.chek.setTag(udis[position]);
holder.chek.setOnClickListener(new OnClickListener() {
private String s;
@Override
public void onClick(View v) {
if (((CheckBox) v).isChecked()){
checkBoxState[position]=true;
// isChecked=true;
s=(String)v.getTag();
Log.e("IDDDDDDDD", s);
userid.add(s);
Log.e("ADDED ID", userid.toString());
}
else{
checkBoxState[position]=false;
s=(String)v.getTag();
userid.remove(s);
Log.e("Removed ID", userid.toString());
}
}
}
);
final Custom custom = entries.get(position);
if (custom != null) {
holder.item1.setText(custom.getcustomBig());
holder.item2.setText(custom.getcustomSmall());
}
return v;
}
public Filter getFilter() {
if (customFilter == null) {
customFilter = new CustomFilter();
}
return customFilter;
}
public ArrayList<String> getUserid() {
return userid;
}
public void setUserid(ArrayList<String> userid) {
this.userid = userid;
}
private class CustomFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint == null || constraint.length() == 0) {
results.values=entries;
results.count = entries.size();
}
else{
ArrayList<Custom> newValues = new ArrayList<Custom>();
for (Custom i : entries){
if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
newValues.add(i);
}
}
// TODO Auto-generated method stub
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results.count == 0){
notifyDataSetInvalidated();
}
else{
@SuppressWarnings("unchecked")
ArrayList<Custom> lst = (ArrayList<Custom>)results.values;
ArrayList<Custom> itemsList = new ArrayList<Custom>(lst);
//this.items=mItems;
entries =itemsList;
notifyDataSetChanged();
}
}
}
}
您的publishResults()
方法应该如下所示:
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.count == 0){
notifyDataSetInvalidated();
} else {
@SuppressWarnings("unchecked")
ArrayList<Custom> lst = (ArrayList<Custom>)results.values;
ArrayList<Custom> itemsList = new ArrayList<Custom>(lst);
entries = itemsList;
clear();
for (Custom item : entries) {
add(item);
}
}
}
@覆盖
受保护的void publishResults(CharSequence约束、FilterResults结果){
如果(results.count==0){
notifyDataSetionValidated();
}否则{
@抑制警告(“未选中”)
ArrayList lst=(ArrayList)results.values;
ArrayList itemsList=新的ArrayList(lst);
条目=项目列表;
清除();
用于(自定义项:条目){
增加(项目);
}
}
}
进行筛选时,结果在条目列表中设置,但适配器不是基于该列表,而是基于您在构造函数中传递的列表。在publishResults()
方法调用clear()
中,然后在for
循环中迭代itemlist
并使用适配器的add()
方法添加每个项。@Luksprog您能用code解释相同的问题吗?@user2699728这是因为您没有从performFiltering()返回结果)
。在该方法中,返回结果之前代码>行添加行results.count=newValues.size();results.values=新值
@user2699728您是否确实在performFiltering()
方法中记录了代码,以查看newValues
列表中是否有任何值?当您在编辑文本
中键入内容时,列表视图
仍保留当前值,或者您只是在列表视图
中看不到任何筛选值?我在newValues中没有得到任何值。我检查过了。@user2699728那么您显然没有任何筛选值。检查您的if
条件(if(i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
)有问题。确保Custom
类中的toString()
返回要筛选的正确数据。现在我正在以newValues获取数据,但它没有被筛选?
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.count == 0){
notifyDataSetInvalidated();
} else {
@SuppressWarnings("unchecked")
ArrayList<Custom> lst = (ArrayList<Custom>)results.values;
ArrayList<Custom> itemsList = new ArrayList<Custom>(lst);
entries = itemsList;
clear();
for (Custom item : entries) {
add(item);
}
}
}