SherlockActionバーのSearchViewに検索フィルターを実装しました。
Mと入力すると、フィルターされた結果をMで始まるリストビューに表示したい、などです。しかし、今はランダムな結果を示しています。
public boolean onQueryTextChange(String newText) {
Log.i("Nomad", "onQueryTextChange");
if (TextUtils.isEmpty(newText)) {
adapter.getFilter().filter("");
Log.i("Nomad", "onQueryTextChange Empty String");
placesListView.clearTextFilter();
} else {
Log.i("Nomad", "onQueryTextChange " + newText.toString());
adapter.getFilter().filter(newText.toString());
}
return true;
}
public boolean onQueryTextSubmit(String query) {
Log.i("Nomad", "onQueryTextSubmit");
return false;
}
public boolean onClose() {
Log.i("Nomad", "onClose");
return false;
}
これをアダプター内に配置します。
@Override
public Filter getFilter(){
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if (constraint != null && constraint.toString().length() > 0) {
List<String> founded = new ArrayList<String>();
for(YourListItemType item: origData){
if(item.toString().toLowerCase().contains(constraint)){
founded.add(item);
}
}
result.values = founded;
result.count = founded.size();
}else {
result.values = origData;
result.count = origData.size();
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
for (String item : (List<String>) results.values) {
add(item);
}
notifyDataSetChanged();
}
}
}
そして、あなたのアダプターの内部コンストラクター
public MyAdapter(Context context, int layoutResourceId, String[] places) {
super(context, layoutResourceId, data);
this.context = context;
this.data = Arrays.asList(places);
this.origData = new ArrayList<String>(this.data);
}
アダプターからフィルターを取得し、クエリの変更時にsearchviewフィールドで変更された文字列をフィルターします。
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
getListAdapter().getFilter().filter(newText);
return true;
}
});
Listview_arrに要素を追加すると、残りのコードは以下になります...:-
listview_arr = new String[listview_array_location.length];
listview_arr = listview_array;
setListAdapter(new bsAdapter(this));
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
public void onTextChanged(CharSequence s,int start, int before, int count)
{
/*Log.d("count","count==>"+s.length());
if(((s.length()-temp)%4)==0)
{
Log.d("in if","if in if"+(s.length()-temp));
et.setText(et.getText().toString()+" ");
int position = et.getText().toString().length();
Editable etext = et.getText();
Selection.setSelection(etext, position);
temp++;
}*/
Log.d("count","count==>"+s);
textlength = et.getText().length();
array_sort.clear();
for (int i = 0; i < listview_array_location.length; i++)
{
if (textlength <= listview_array_location[i].length())
{
if(et.getText().toString().equalsIgnoreCase((String)listview_array_location[i].subSequence(0,textlength)))
{
array_sort.add(listview_array[i]);
}
}
}
AppendList(array_sort);
}
});
}
public void AppendList(ArrayList<String> str)
{
listview_arr = new String[str.size()];
listview_arr = str.toArray(listview_arr);
setListAdapter(new bsAdapter(this));
}
public class bsAdapter extends BaseAdapter
{
Activity cntx;
public bsAdapter(Activity context)
{
// TODO Auto-generated constructor stub
this.cntx=context;
}
public int getCount()
{
// TODO Auto-generated method stub
return listview_arr.length;
}
public Object getItem(int position)
{
// TODO Auto-generated method stub
return listview_arr[position];
}
public long getItemId(int position)
{
// TODO Auto-generated method stub
return listview_array.length;
}
public View getView(final int position, View convertView, ViewGroup parent)
{
View row=null;
LayoutInflater inflater=cntx.getLayoutInflater();
row=inflater.inflate(R.layout.search_list_item, null);
TextView tv=(TextView)row.findViewById(R.id.title);
Button Btn01=(Button)row.findViewById(R.id.Btn01);
Button Btn02=(Button)row.findViewById(R.id.Btn02);
tv.setText(listview_arr[position]);
Btn01.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(SearchUser.this, "Button 1 "+listview_arr[position], Toast.LENGTH_SHORT).show();
int color = PreferenceManager.getDefaultSharedPreferences(
SearchUser.this).getInt(COLOR_PREFERENCE_KEY, Color.WHITE);
new ColorPickerDialog(SearchUser.this, SearchUser.this, color).show();
}
});
Btn02.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(SearchUser.this, "Button 2 "+listview_arr[position], Toast.LENGTH_SHORT).show();
}
});
return row;
}
}
あなたは単にこれを通過することができます 例 。アプリケーションに統合するのは非常に簡単です
これが配列とEditTextのaddTextChangedListener
のロジックです