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

// メニューの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();
}
}
}

Source

Posted by arkgame