Android:ListView过滤器无法正常工作

Android:ListView过滤器无法正常工作,android,Android,我正在列出来自服务器的不同数据。考虑到我有5种不同类型的数据在我的列表中。我想根据一个数据筛选列表。为此,我编写了以下代码 eventFilter = (EditText) rootView.findViewById(R.id.eventFilter); eventFilter.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int s

我正在列出来自服务器的不同数据。考虑到我有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;
            }