Android利用Filter过滤数据

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.TextView;

public class ListViewAdapter extends BaseAdapter {
  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;
  }

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

    }}

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
     />

</RelativeLayout>
<?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>
时间: 2024-10-12 13:04:03

Android利用Filter过滤数据的相关文章

Android利用数据库传送数据

---恢复内容开始--- 一.建表 //通过SQLiteDatabase 创建数据库stu.db3 final SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"/stu.db3", null); db.execSQL("CREATE TABLE student(id INTEGER PRIMARY KEY, name VARCHAR(50), scor

Android --------- 利用SharedPreferences存取数据

//向SharedPreferences中存放数据 //1.定义SharedPreferences对象,通过getSharedPreferences方法得到 SharedPreferences sp = getSharedPreferences(文件名, 模式);//模式通常为MODE_PRIVATE //2.获得该SharedPreferences对象的编辑器Editor Editor editor = sp.edit(); //3.通过编辑器向SharedPreferences中存放数据 e

利用Filter实现数据的压缩回写

具体的Filter实现 public class GzipFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletRespons

用php自带的filter函数验证、过滤数据 -转载

PHP过滤器包含两种类型 Validation:用来验证验证项是否合法 Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters_list() 用来列出当前系统所支持的所有过滤器. 1 2 3 4 5 6 <?php foreach(filter_list() as $id => $filter) {    echo $filter.'    '.filter_id($filter)."\n"; } ?

[PY3]——过滤数据——列表推导、filter()、itertools.compress()

问题 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 解决方案 最简单的过滤数据的方法,就是使用列表推导. 使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集,对内存敏感时可以考虑使用生成器表达式迭代产生过滤元素 在过滤规则比较复杂不便于用简单的列表推导就写出来的情况下,这时可以考虑写成将规则写成一个函数,然后使用内建的 filter() 函数 还有过滤工具 itertools.compress() 列表推导 lst=[1,4,-5,10,-7,2,3,

Android利用代码清除App的数据和重启设备

/** * 利用代码清除App的数据 * 平常我们在清除App的数据时,多半在设置中找到对应的App * 然后选择其清除数据.下面给出代码实现. * * 注意事项: * 1 设备需要root * 2 注意在命令的末尾需要加上换行\n * 这就相当于我们平时在Dos中输入命令后再换行一样. * 否则命令不会执行. */ private void cleanData(String packageName){ try { System.out.println("---> 9527 开始清除 &q

android利用剪切板来实现数据的传递

在Android开发中我们经常要遇到的一个问题就是数据在不同的Activity之间的共享.在Android开发中有很多种方法可以达到这个目地. 这里介绍一种比较常见.又常用的一种方法就是使用剪切板.我们都有用过Window.Linux上的Copy.这里介绍的就是这种. 调用服务 [java] view plaincopy ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOAR

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ