Filter(三)——Android利用Filterable接口过滤数据

简介: MainActivity如下: package cc.testfilterable;import java.util.ArrayList;import java.

MainActivity如下:

package cc.testfilterable;

import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.widget.ListView;
import android.app.Activity;
import android.content.Context;
/**
 * Demo描述:
 * 利用Filter过滤数据
 * 可用于AutoCompleteTextView筛选数据等功能
 * 
 * 备注说明:
 * 该Demo只表述原理,代码逻辑较简单,有一些小的bug.
 * 完整的应用请参见以下资料.
 * 
 * 参考资料:
 * 1 http://gundumw100.iteye.com/blog/1446507
 * 2 http://blog.csdn.net/ssstudio/article/details/7579089
 * 3 http://blog.csdn.net/jiahui524/article/details/7802033
 * 
 */
public class MainActivity extends Activity {
	private Context mContext;
    private ListView mListView;
    private ListViewAdapter mListViewAdapter;
    private ArrayList<String> mArrayList;
    private HashMap<String, String> mHashMap;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init(){
		mContext=this;
		mListView=(ListView) findViewById(R.id.listView);
		mArrayList=new ArrayList<String>();
		mArrayList.add("张三1");
		mArrayList.add("李四1");
		mArrayList.add("王五1");
		mArrayList.add("张三2");
		mArrayList.add("李四2");
		mArrayList.add("王五2");
		mArrayList.add("张三3");
		mArrayList.add("李四3");
		mArrayList.add("王五3");
		mArrayList.add("张三4");
		mArrayList.add("李四4");
		mArrayList.add("王五4");
		mListViewAdapter=new ListViewAdapter(mContext, mArrayList);
		//过滤数据
		//过滤出姓名里面包含"张"的数据
		mListViewAdapter.getFilter().filter("张");
		mListView.setAdapter(mListViewAdapter);
	}

}

ListViewAdapter如下:

package cc.testfilterable;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

public class ListViewAdapter extends BaseAdapter implements Filterable{
	private NameFilter mNameFilter;
	private List<String> mArrayList;
	private List<String> mFilteredArrayList;
	private LayoutInflater mLayoutInflater;
	public ListViewAdapter(Context context,List<String> arrayList) {
		mArrayList = arrayList;
		mLayoutInflater=LayoutInflater.from(context);
		mFilteredArrayList=new ArrayList<String>();
	}

	@Override
	public int getCount() {
		if (mArrayList == null) {
			return 0;
		} else {
			return (mArrayList.size());
		}

	}

	@Override
	public Object getItem(int position) {
		if (mArrayList == null) {
			return null;
		} else {
			return mArrayList.get(position);
		}
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
	
	//该方法来自接口Filterable
	@Override
	public Filter getFilter() {  
       if (mNameFilter == null) {    
    	   mNameFilter = new NameFilter();    
       }    
      return mNameFilter;  
    }  

	
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View itemView = null;
		itemView = convertView;
		ViewHolder viewHolder = null;
		if (itemView == null) {
			itemView = mLayoutInflater.inflate(R.layout.listviewitem, null);
			viewHolder = new ViewHolder();
			viewHolder.textView = (TextView) itemView.findViewById(R.id.textView);
			itemView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) itemView.getTag();
		}

		if (mArrayList != null) {
			if (viewHolder.textView != null) {
				viewHolder.textView.setText((mArrayList.get(position)));
			}

		}

		convertView = itemView;
		return convertView;
	}
	

	private class ViewHolder {
		TextView textView;
	}
	
	
	//过滤数据
	class NameFilter extends Filter {
		//执行筛选
		@Override
		protected FilterResults performFiltering(CharSequence charSequence) {
			FilterResults filterResults = new FilterResults();
			for (Iterator<String> iterator = mArrayList.iterator(); iterator.hasNext();) {
				String name = iterator.next();
				System.out.println("---> name=" + name);
				if (name.contains(charSequence)) {
					mFilteredArrayList.add(name);
				}
			}
			filterResults.values = mFilteredArrayList;
			return filterResults;
		}

		//筛选结果
		@Override
		protected void publishResults(CharSequence arg0, FilterResults results) {
			mArrayList = (List<String>) results.values;
			if (results.count > 0) {
				notifyDataSetChanged();
			} else {
				notifyDataSetInvalidated();
			}

		}}

	
}


listviewitem.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
     >
    <TextView 
       android:id="@+id/textView"
       android:layout_width="wrap_content"
       android:layout_height="50dip"
       android:gravity="center"
    />    
   
</LinearLayout>





相关文章
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
|
3月前
|
Linux Android开发
Android 正常运行所需的一系列 Linux 内核接口
Android 正常运行所需的一系列 Linux 内核接口
53 0
|
4月前
|
XML 物联网 API
Android Ble蓝牙App(五)数据操作
Android Ble蓝牙App(五)数据操作
|
4月前
|
数据库 Android开发 开发者
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
Android Studio入门之内容共享ContentProvider讲解以及实现共享数据实战(附源码 超详细必看)
39 0
|
8天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
9 0
|
8天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0
|
4月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
164 0
|
22天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
23 1
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
34 3
|
2月前
|
JavaScript Java 数据安全/隐私保护
安卓逆向 -- POST数据解密
安卓逆向 -- POST数据解密
25 2