我列出了来自服务器的不同数据。假设我的列表中有5种不同类型的数据。我想根据一个数据筛选列表。为此,我编写了以下代码。
eventFilter = (EditText) rootView.findViewById(R.id.eventFilter);
eventFilter.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@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
search_data = s.toString();
}
});
Button searchbtn = (Button) rootView.findViewById(R.id.searchbtn);
searchbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
search = new SearchFilter(context, cts);
search.getFilter().filter(search_data);
}
});
在上面的代码中,我只是将文本值传递给SearchFilter。
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
if(cFilter==null)
{
cFilter=new CustomFilter();
}
return cFilter;
}
public class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<CalEvent>(event);
}
}
if (prefix == null || prefix.length() == 0) {
ArrayList<CalEvent> list;
synchronized (mLock) {
list = new ArrayList<CalEvent>(mOriginalValues);
}
results.values = list;
results.count = list.size();
} else {
String prefixString = prefix.toString().toLowerCase();
ArrayList<CalEvent> values;
synchronized (mLock) {
values = new ArrayList<CalEvent>(mOriginalValues);
}
final int count = values.size();
final ArrayList<CalEvent> newValues = new ArrayList<CalEvent>();
for (int i = 0; i < count; i++) {
CalEvent value=values.get(i);
EventType type = EventType.getEventType(value.event_type);
String valueText = type.name.toLowerCase();
if (valueText.indexOf(prefixString)!=-1) {
newValues.add(value);
Toast.makeText(ctx, value.toString(), Toast.LENGTH_SHORT).show();
Log.i("value.toString",value.toString());
} else {
ProjectEventFragment.cts.clear();
ProjectEventFragment.adapter.notifyDataSetChanged();
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
}
在这里,如果我键入了一些列表中不可用的数据,那么列表应该是空的,或者如果可用,那么它应该根据可用数据列出。如果数据不可用,则我正在清除并设置为notifyDataSetChanged
。当我键入不可用的数据时,列表将删除所有数据。但是,当我键入可用数据时,它并没有显示所有数据。
我不知道哪里做错了。请纠正我。
除非您在这里发布完整的代码,否则我很难理解整个想法。您可能犯的错误是查询原始数据集,当您在搜索栏中输入null时,原始数据集可能会被清除。尝试将原始数据集存储为临时数据集,然后查询临时数据集而不是原始数据集。当用户输入null时显示原始数据集,当键入某个内容时查询临时数据集。看看下面提供的示例,这应该会有所帮助。
protected FilterResults performFiltering(CharSequence query) {
FilterResults results = new FilterResults();
ArrayList<Notification> resultList = new ArrayList<Notification>();
ArrayList<TagUser> receivingUsers = new ArrayList<TagUser>();
if (query == null || query.length() == 0) {
results.values = tempNotifcationList;
results.count = tempNotifcationList.size();
} else {
for (int i = 0; i < tempNotifcationList.size(); i++) {
String sendingUser = tempNotifcationList.get(i).getTag().getSendingUser().getDisplayName();
String message = tempNotifcationList.get(i).getTag().getMessage();
if (sendingUser != null) {
if (sendingUser.toLowerCase().startsWith(query.toString().toLowerCase())) {
resultList.add(tempNotifcationList.get(i));
continue;
}
}
for (String key : tempNotifcationList.get(i).getTag().getReceivingUsers().keySet()) {
receivingUsers.add(tempNotifcationList.get(i).getTag().getReceivingUsers().get(key));
}
if (receivingUsers != null && receivingUsers.size() > 0) {
for (TagUser taguser : receivingUsers) {
Log.d(TAG, "Receiving User:" + taguser.getDisplayName());
if (taguser.getDisplayName().toLowerCase().startsWith(query.toString().toLowerCase())) {
Log.d(TAG, "Receiving User:" + taguser.getDisplayName());
resultList.add(tempNotifcationList.get(i));
}
break;
}
continue;
}
if (message != null) {
if (message.toLowerCase().startsWith(query.toString().toLowerCase())) {
resultList.add(tempNotifcationList.get(i));
continue;
}
}
}
Log.d(TAG, "Done Searching");
results.values = resultList;
results.count = resultList.size();
}
Log.d(TAG, "result set count:" + results.count);
return results;
}