问题描述
我尝试了几种为ListView实现过滤器/搜索功能的方法,但是没有用。我希望有人可以帮助我。我正在尝试使文本添加到EditText中时,列表视图将根据添加的文本而变化。例如,当我在EditText中输入“ c”时,只有“ c”将出现在带有图标的列表视图中。
更新:现在,搜索过滤器可以正常工作,但是当我搜索字母时,图像与原始字母不匹配。请告知。
下面是所有数组和数组列表。
String Names[] = {"a","b","c","d","e"};
int Images[] = {R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,R.drawable.icon4,R.drawable.icon5};
ArrayList<String> filteredList;
String temporaryList[] = devicesName.clone();
下面是带有addTextChangedListener的EditText SearchFilter
EditText searchfilter = (EditText) root.findViewById(R.id.searchFilter);
searchfilter.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence,int i,int i1,int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence,int i2) {
customAdapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
下面是自定义适配器。
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return Names.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i,View view,ViewGroup viewGroup) {
view = getLayoutInflater().inflate(R.layout.row,null);
TextView textView_name = (TextView) view.findViewById(R.id.PhoneName);
ImageView imageView = (ImageView) view.findViewById(R.id.imagePhone);
textView_name.setText(Names[i]);
imageView.setimageResource(Images[i]);
return view;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<String> FilteredArrayNames = new ArrayList<String>();
// perform your search here using the searchConstraint String.
if (constraint == null || constraint.length() == 0){
FilteredArrayNames.addAll(Arrays.asList(temporaryList));
} else{
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < temporaryList.length; i++) {
String datanames = temporaryList[i];
if (datanames.toLowerCase().startsWith(constraint.toString())) {
FilteredArrayNames.add(datanames);
}
}
}
results.count = FilteredArrayNames.size();
results.values = FilteredArrayNames;
Log.e("VALUES",results.values.toString());
return results;
}
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
temporaryList = (ArrayList<String>) results.values;
Names = new String[temporaryList.size()];
temporaryList.toArray(Names);
notifyDataSetChanged();
}
};
return filter;
}
}
据我了解,在Filter()代码中,我将过滤后的名称存储到ArrayList TemporaryList()中,然后将名称传递到字符串列表中。我的另一个担心是,它仅过滤文本,而不过滤图像。任何帮助将不胜感激。
解决方法
您的图像名称在图像数组中相同。我认为这就是为什么您获得不同的图像。更改图像名称,然后尝试一次
,尝试此代码:
public class FilterAdapter extends ArrayAdapter<FilterModel> implements Filterable {
private Context context;
private List<FilterModel> itemsList = new ArrayList<>();
private List<FilterModel> original_itemsList = new ArrayList<>();
private LayoutInflater inflater;
private int layout_ID;
private CountryFilter filter;
SharedPrefreancesUtils sharedPrefreancesUtils = new SharedPrefreancesUtils();
public FilterAdapter(Context context,List<FilterModel> itemArray,int textViewResourceId){
super(context,textViewResourceId,itemArray);
this.context =context;
this.itemsList = new ArrayList<FilterModel>();
this.itemsList.addAll(itemArray);
this.layout_ID = textViewResourceId;
this.original_itemsList = new ArrayList<FilterModel>();
this.original_itemsList.addAll(itemArray);
}
static class ViewHolder {
public TextView txt_company_name;
}
@Override
public View getView(final int position,View view,ViewGroup parent) {
View convertView = view;
final ViewHolder viewHolder;
inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(layout_ID,parent,false);
viewHolder = new ViewHolder();
viewHolder.txt_company_name = (TextView) convertView.findViewById(R.id.txt_company_name);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txt_company_name.setText(" " + itemsList.get(position).getCompanyName());
return convertView;
}
@Override
public Filter getFilter() {
if (filter == null){
filter = new CountryFilter();
}
return filter;
}
private class CountryFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<FilterModel> filteredItems = new ArrayList<FilterModel>();
for(int i = 0,l = original_itemsList.size(); i < l; i++)
{
FilterModel country = original_itemsList.get(i);
String site_name = country.getCompanyName();
if(job_number.toString().toUpperCase().contains(constraint.toString().toUpperCase())){
filteredItems.add(country);
} else if(site_name.toUpperCase().contains(constraint.toString().toUpperCase())) {
filteredItems.add(country);
}
}
result.count = filteredItems.size();
result.values = filteredItems;
}
else
{
synchronized(this)
{
result.values = original_itemsList;
result.count = original_itemsList.size();
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,FilterResults results) {
itemsList = (ArrayList<FilterModel>)results.values;
notifyDataSetChanged();
clear();
for(int i = 0,l = itemsList.size(); i < l; i++)
add(itemsList.get(i));
notifyDataSetInvalidated();
}
}
}