2014-03-12 64 views
1
String filterText="abc"; 
adapter.getFilter().filter(filterText); 

我要過濾我的適配器即便:如何通過忽略大小寫來過濾ListView適配器?

filterText="Abc"; 

filterText="aBc"; 

等。

+0

你有你自己的文件管理器類?將會有一行對列表項檢查約束,並且可以在那裏執行toLower()類型的函數。 –

+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

嘗試僅發佈相關代碼...不要轉儲,因爲它是 –

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; 
    } 
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) 
{ 

} 
}