Android 利用SearchView实现ListView过滤

package org.load.searchView;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
     private List<String> mData = new ArrayList<String>();  // 这个数据会改变
     private List<String> mBackData;  // 这是原始的数据
 
     private ListView mListView;
     private SearchView mSearchView;
 
     private MyAdapter mAdapter;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         mListView = (ListView) super .findViewById(R.id.list);
         mListView.setTextFilterEnabled( true );
         mListView.setOnItemClickListener( new ItemClick());
 
         initData();
 
         mAdapter = new MyAdapter();
         mListView.setAdapter(mAdapter);
     }
 
     // 必须实现Filterable接口
     private class MyAdapter extends BaseAdapter implements Filterable {
         private MyFilter mFilter;
 
         @Override
         public int getCount() {
             return mData.size();
         }
 
         @Override
         public Object getItem( int position) {
             return mData.get(position);
         }
 
         @Override
         public long getItemId( int position) {
             return position;
         }
 
         @Override
         public View getView( int position, View convertView, ViewGroup parent) {
             if ( null == convertView) {
                 convertView = View.inflate(MainActivity. this , R.layout.item,
                         null );
             }
 
             TextView show = (TextView) convertView.findViewById(R.id.show);
 
             show.setText(mData.get(position));
 
             return convertView;
         }
 
         @Override
         public Filter getFilter() {
             if ( null == mFilter) {
                 mFilter = new MyFilter();
             }
             return mFilter;
         }
         
         // 自定义Filter类
         class MyFilter extends Filter {
             @Override
             // 该方法在子线程中执行
             // 自定义过滤规则
             protected FilterResults performFiltering(CharSequence constraint) {
                 FilterResults results = new FilterResults();
 
                 List<String> newValues = new ArrayList<String>();
                 String filterString = constraint.toString().trim()
                         .toLowerCase();
 
                 // 如果搜索框内容为空,就恢复原始数据
                 if (TextUtils.isEmpty(filterString)) {
                     newValues = mBackData;
                 } else {
                     // 过滤出新数据
                     for (String str : mBackData) {
                         if (- 1 != str.toLowerCase().indexOf(filterString)) {
                             newValues.add(str);
                         }
                     }
                 }
 
                 results.values = newValues;
                 results.count = newValues.size();
 
                 return results;
             }
 
             @Override
             protected void publishResults(CharSequence constraint,
                     FilterResults results) {
                 mData = (List<String>) results.values;
 
                 if (results.count > 0 ) {
                     mAdapter.notifyDataSetChanged();  // 通知数据发生了改变
                 } else {
                     mAdapter.notifyDataSetInvalidated(); // 通知数据失效
                 }
             }
         }
     }
     
     // 搜索文本监听器
     private class QueryListener implements OnQueryTextListener {
         // 当内容被提交时执行
         @Override
         public boolean onQueryTextSubmit(String query) {
             return true ;
         }
 
         // 当搜索框内内容发生改变时执行
         @Override
         public boolean onQueryTextChange(String newText) {
             if (TextUtils.isEmpty(newText)) {
                 mListView.clearTextFilter();  // 清楚ListView的过滤
             } else {
                 mListView.setFilterText(newText); // 设置ListView的过滤关键词
             }
             return true ;
         }
     }
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.main, menu);
         
         // 获取Menu中searchView组件
         mSearchView = (SearchView) MenuItemCompat.getActionView(menu
                 .findItem(R.id.search));
         
         // 设置监听器
         mSearchView.setOnQueryTextListener( new QueryListener());
         return true ;
     }
 
     private void initData() {
         for ( int i = 0 ; i < 50 ; i++) {
             mData.add( "hello android " + i);
         }
         mBackData = mData;
     }
 
     private class ItemClick implements OnItemClickListener {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position,
                 long id) {
             Toast.makeText(MainActivity. this , mData.get(position),
                     Toast.LENGTH_SHORT).show();
         }
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值