ArrayAdapterのカスタム拡張クラスのインスタンスオブジェクトを持つ私のメインのカスタムリストアクティブクラスがあります。私のTextwatcherはキャラクターを拾っていて、アダプター上で問題なく検索していますが、「Backspace」または「DEL」ボタンを押してキャラクターを削除すると、リストビューはすべてのレコードを表示する代わりに空になります..Android - カスタムリストビューのフィルタがnullを返す
これは私の活動です。
adapter = new ProjectArrayAdapter(this, titles, statuses, ids, starteds);
eTprojectsearch = (EditText) findViewById(R.id.txtprojectsearch);
eTprojectsearch.addTextChangedListener(Listener__SearchProject);
eTprojectsearch.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// TODO Auto-generated method stub
if(actionId == KeyEvent.KEYCODE_DEL) {
if(eTprojectsearch.getText().toString().trim().equals("")) {
setListAdapter(adapter);
}
}
return false;
}
});
setListAdapter(adapter);
のMy機能Listener__SearchProjectが..です
private TextWatcher Listener__SearchProject = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
adapter.notifyDataSetChanged();
//notifyAll();
/*
* if(s.length() == -1) {
setListAdapter(adapter);
} else {
adapter.getFilter().filter(s,new Filter.FilterListener() {
public void onFilterComplete(int count) {
Log.i("ADAPTER:COMPLETE COUNT",String.valueOf(count));
adapter.setNotifyOnChange(true);
}
});
}
*/
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
};
そして、ここでは私のViewholderと私のアダプタの完全なクラスであり、など
package com.plumleaf.leaf;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
/**
*
* @author Hamza
* @since PlumLeaf.2012
* @category Custom Array Adapters
*
*/
public class ProjectArrayAdapter extends ArrayAdapter<String> implements Filterable {
private final Activity context;
private final List<String> titles;
private final List<String> statuses;
private final List<String> ids;
private final List<String> starteds;
ProjectFilter filter;
public final Object mLock = new Object();
ArrayList<String> items;
ArrayList<String> filteredItems;
static class PViewHolder {
public TextView title;
public TextView status;
public TextView id;
public TextView started;
}
public ProjectArrayAdapter(Activity context, List<String> titles,List<String> statuses,List<String> ids,List<String> starteds) {
super(context, R.layout.projectlist, titles);
this.context = context;
this.titles = titles;
this.statuses = statuses;
this.ids = ids;
this.starteds = starteds;
this.items = (ArrayList<String>)titles;
this.filteredItems = this.items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.projectlist, null);
PViewHolder viewHolder = new PViewHolder();
viewHolder.title = (TextView) rowView.findViewById(R.id.projecttitle);
viewHolder.status = (TextView) rowView.findViewById(R.id.projectstatus);
viewHolder.id = (TextView) rowView.findViewById(R.id.projectid);
viewHolder.started = (TextView) rowView.findViewById(R.id.projectstarted);
rowView.setTag(viewHolder);
}
PViewHolder holder = (PViewHolder) rowView.getTag();
String title = titles.get(position);
String status = statuses.get(position);
String id = ids.get(position);
String started = starteds.get(position);
holder.title.setText((title.length() > 17 ? title.substring(0, 17)+"..." : title));
holder.status.setText(status);
holder.id.setText(id);
holder.started.setText(started);
return rowView;
}
public Filter getFilter() {
if (filter == null){
filter = new ProjectFilter();
}
return filter;
}
private class ProjectFilter extends Filter {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
results.values = items;
results.count = items.size();
}
} else {
synchronized(mLock) {
String prefixString = prefix.toString().toLowerCase();
final ArrayList filteredItems = new ArrayList();
final ArrayList localItems = new ArrayList();
localItems.addAll(items);
final int count = localItems.size();
for (int i = 0; i < count; i++) {
final String cString = String.valueOf(localItems.get(i));
if (cString.contains(prefixString.toLowerCase())) {
filteredItems.add(cString);
}
}
results.values = filteredItems;
results.count = filteredItems.size();
}//end synchronized
}
return results;
}
protected void publishResults(CharSequence prefix, FilterResults results) {
synchronized(mLock) {
@SuppressWarnings("unchecked")
final ArrayList<String> localItems = (ArrayList<String>) results.values;
notifyDataSetChanged();
clear();
for (Iterator<String> iterator = localItems.iterator(); iterator
.hasNext();) {
String gi = (String) iterator.next();
add(gi);
}
}//end synchronized
}
}
}
私は「どこに私を指摘してください
それは男の作品です!どうもありがとう。私はちょうどこれ以上の2日を過ごした。 。ほんとうに素晴らしい。もう一度おねがいします! しかし、別の問題が出てきます。私はそれを入力すると適切な検索結果を返し、delキーを押すとうまくいきます。しかし、もし私がHのような別のキャラクターを押すと、それからUは再び空になります。私はHUで始まるプロジェクトを..... .....それはそれを返す必要があります.. –
あなたは確かですか最終的なString cString = String.valueOf(localItems.get(i));常に小文字のテキストを返しますか? – dira
それは必要ではありません。文字があります。ラクダのケースで検索しているから。 –