我有我的主要自定義列表活動類,它具有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);
我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,則它再次變爲空。我有項目,開始與胡.....所以它必須返回.. – 2012-03-13 12:40:39
你確定最終字符串cString = String.valueOf(localItems.get(i));總是返回小寫文本? – dira 2012-03-13 12:47:00
不,這不是必要的。會有任何字符。因爲搜索駱駝案件。 – 2012-03-13 12:56:42