如何通过忽略大小写来过滤ListView适配器?

时间:2014-03-12 04:43:53

标签: android android-listview android-adapter

String filterText="abc";
adapter.getFilter().filter(filterText);

我想过滤我的适配器,即使:

filterText="Abc";

filterText="aBc";

等等。

3 个答案:

答案 0 :(得分:1)

您没有提供此处使用的代码所以我在此提供示例应用程序代码请参阅此答案。

MainActivity.java

public class MainActivity extends Activity {

private ListView mListView;
private CustomAdapter mCustomAdapter;
private EditText mEditText;
private ArrayList<Contacts> _Contacts = new ArrayList<Contacts>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    for (int i = 0; i < 100; i++) {
        Contacts contacts = new Contacts();
        contacts.setId(""+i);
        contacts.setName("Name "+i);
        _Contacts.add(contacts);
    }


    mListView = (ListView) findViewById(R.id.listView1);
    mEditText = (EditText) findViewById(R.id.editText1);

    mCustomAdapter = new CustomAdapter(MainActivity.this, _Contacts);
    mListView.setAdapter(mCustomAdapter);

    mEditText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            mCustomAdapter.getFilter().filter(arg0);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {

        }
    });
}

}

CustomAdapter.java

public class CustomAdapter extends BaseAdapter implements Filterable{

private ArrayList<Contacts> _Contacts;
private Activity context;
private LayoutInflater inflater;
private ValueFilter valueFilter;
private ArrayList<Contacts> mStringFilterList;

public CustomAdapter(Activity context, ArrayList<Contacts> _Contacts) {
    super();
    this.context = context;
    this._Contacts = _Contacts;
    mStringFilterList =  _Contacts;
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     getFilter();
}

@Override
public int getCount() {
    return _Contacts.size();
}

@Override
public Object getItem(int position) {
    return _Contacts.get(position).getName();
}

@Override
public long getItemId(int position) {
    return 0;
}

public class ViewHolder {
    TextView tname, tplace;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.activity_main, null);
        holder.tname = (TextView) convertView.findViewById(R.id.textView1);
        holder.tplace = (TextView) convertView.findViewById(R.id.textView2);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();
    holder.tname.setText("" + _Contacts.get(position).getName());
    holder.tplace.setText("" + "" + _Contacts.get(position).getId());
    return convertView;
}

@Override
public Filter getFilter() {
    if(valueFilter==null) {

        valueFilter=new ValueFilter();
    }

    return valueFilter;
}
private class ValueFilter extends Filter {

    //Invoked in a worker thread to filter the data according to the constraint.
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results=new FilterResults();
        if(constraint!=null && constraint.length()>0){
            ArrayList<Contacts> filterList=new ArrayList<Contacts>();
            for(int i=0;i<mStringFilterList.size();i++){
                if((mStringFilterList.get(i).getName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {
                    Contacts contacts = new Contacts();
                    contacts.setName(mStringFilterList.get(i).getName());
                    contacts.setId(mStringFilterList.get(i).getId());
                    filterList.add(contacts);
                }
            }
            results.count=filterList.size();
            results.values=filterList;
        }else{
            results.count=mStringFilterList.size();
            results.values=mStringFilterList;
        }
        return results;
    }


    //Invoked in the UI thread to publish the filtering results in the user interface.
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        _Contacts=(ArrayList<Contacts>) results.values;
        notifyDataSetChanged();
    }
}
}

Contacts.java

public class Contacts {

private String name;
private String id;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
}

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" >

    <requestFocus />
</EditText>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</ListView>

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_marginTop="2dp"
android:background="@android:color/black"
android:gravity="center_vertical"
android:paddingBottom="2dp"
android:paddingTop="2dp"
tools:context=".MainActivity" >


<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@android:color/white" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:text="Small Text"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/white" />

这是一个示例项目代码。使用此代码,这将真正帮助您

答案 1 :(得分:1)

正如您所说,您有自定义过滤器,只需修改..

请参阅以下代码: -

private class TestFilter extends Filter
{

@Override
protected FilterResults performFiltering(CharSequence constraint) 
{
FilterResults results = new FilterResults();
ArrayList<HashMap<String, Object>> filteredItems = null;

if (constraint != null && constraint.toString().length() > 0) 
{
      for (int index = 0; index < dataSource.getData().size(); index++) 
      {
HashMap<String, Object> existingItem = dataSource.getData().get(index);
String titleString = existingItem.get(dataSource.getSearchKey()).toString();

if(titleString.toLowerCase().contains(constraint.toString().toLowerCase()))
{
      //please modify the filtering accotding to your code
      HashMap<String, Object> newItem = new HashMap<String, Object>();
      newItem = (HashMap<String, Object>) existingItem.clone();
      newItem.put(ListViewDataSource.SECTION_HEADER_KEY, SEARCH_RESULT);
      filteredItems.add(newItem);
      newItem = null;
}
    }
}
results.values = filteredItems;
return results;
}

@Override
protected void publishResults(CharSequence constraint,FilterResults results) 
{

}
}

答案 2 :(得分:0)

您可以通过转换两个字符串来实现,即您要搜索的内容以及您要搜索的内容为小写字母。这是我如何做的一个例子。

private class InboxFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {

        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<Inbox> filteredItems = new ArrayList<Inbox>();

            for (int i = 0; i < originalInbox.size(); i++) {
                Inbox inboxItem = originalInbox.get(i);
                if ((inboxItem.getMessage().toString().toLowerCase()
                        .contains(constraint))
                                                            ||(inboxItem.get_group_name()!=null&&inboxItem.get_group_name().toString()
                                                                                                                                      .toLowerCase().contains(constraint))
    || (inboxItem.getfromname()!=null)&&(inboxItem.getfromname().toString()
                                        .toLowerCase().contains(constraint))
                                        || (inboxItem.getfrom()!=null)&&(inboxItem.getfrom().toString()
                                                .toLowerCase().contains(constraint))
                                                || (inboxItem.getTo()!=null)&&(inboxItem.getTo().toString()
                                                .toLowerCase().contains(constraint))){filteredItems.add(inboxItem);}}
            result.count = filteredItems.size();
            result.values = filteredItems;
        } else {
            synchronized (this) {
                result.values = originalInbox;
                result.count = originalInbox.size();
            }
        }
        return result;
    }