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>





相关文章
|
11月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1020 4
|
3月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
183 11
|
5月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1168 2
|
8月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
469 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
248 1
|
12月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
480 0
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
276 1
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
214 3
|
Android开发 开发者
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
76 0
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
126 0

热门文章

最新文章