Android:ListView筛选器无法准确工作



我列出了来自服务器的不同数据。假设我的列表中有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;
            }

最新更新