android listview 过滤,Android 利用SearchView实现ListView过滤

使用自定义的Adapter

1.[代码][Java]代码

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 mData = new ArrayList(); // 这个数据会改变

private List 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 newValues = new ArrayList();

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

}

}

}

2.[图片] 1.png

16193049_ttbo.png

3.[图片] 2.png

16193049_9pZV.png

4.[图片] 3.png

16193049_NAMG.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值