SearchView 仅显示来自带有 CustomAdapter 的 listView 的一条相同记录,但 searchView 与 ArrayAdapter 一起工作正常。这是我的适配器
SearchView shows only one & same record from listView with CustomAdapter but searchView works fine with ArrayAdapter. Here's my adapter
import com.example.mis_internee.atendence_app_android.R;
public class EMP_LEAVE_ADAPTER extends ArrayAdapter<String> {
private final Activity context;
private final String[] itemname;
public EMP_LEAVE_ADAPTER(Activity context, String[] itemname) {
super(context, R.layout.mylist, itemname);
// TODO Auto-generated constructor stub
this.context = context;
this.itemname = itemname;
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
ImageView image=(ImageView)rowView.findViewById(R.id.icon);
txtTitle.setText(itemname[position]);
return rowView;
};
}
您必须在您的自定义适配器中实现过滤器 class 并从您的 class 调用此方法,看看
在您的适配器中:
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<String> list = originalData;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
现在在您的 activity 中定义了编辑文本:
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
System.out.println("Text ["+s+"]");
mSearchableAdapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
根据您的要求更改,希望对您有所帮助!!
您需要 return 不同的视图,并且您还需要手动回收视图,如下所示:
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder;
if(view == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);
viewHolder.txtTitle = (TextView) rowView.findViewById(R.id.item);
viewHolder.image=(ImageView)rowView.findViewById(R.id.icon);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.txtTitle.setText(itemname[position]);
return viewHolder;
};
public class viewholder {
public TextView txtTitle;
public ImageView image;
}
import com.example.mis_internee.atendence_app_android.R;
public class EMP_LEAVE_ADAPTER extends ArrayAdapter<String> {
private final Activity context;
private final String[] itemname;
public EMP_LEAVE_ADAPTER(Activity context, String[] itemname) {
super(context, R.layout.mylist, itemname);
// TODO Auto-generated constructor stub
this.context = context;
this.itemname = itemname;
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
ImageView image=(ImageView)rowView.findViewById(R.id.icon);
txtTitle.setText(itemname[position]);
return rowView;
};
}
您必须在您的自定义适配器中实现过滤器 class 并从您的 class 调用此方法,看看
在您的适配器中:
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<String> list = originalData;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
现在在您的 activity 中定义了编辑文本:
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
System.out.println("Text ["+s+"]");
mSearchableAdapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
根据您的要求更改,希望对您有所帮助!!
您需要 return 不同的视图,并且您还需要手动回收视图,如下所示:
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder;
if(view == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);
viewHolder.txtTitle = (TextView) rowView.findViewById(R.id.item);
viewHolder.image=(ImageView)rowView.findViewById(R.id.icon);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.txtTitle.setText(itemname[position]);
return viewHolder;
};
public class viewholder {
public TextView txtTitle;
public ImageView image;
}