更快地进行列表视图搜索

时间:2017-07-10 20:19:27

标签: android listview

我已经能够使用textwatcher根据文件名过滤列表视图中的列表项。但是,我不确定这是否会导致更长的执行时间和冻结帧给定for循环使用和遍历文件列表。

我在listview中搜索的代码:

edsearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

            List<File> ccpt = new ArrayList<File>();
            String text = edsearch.getText().toString().toLowerCase();

             for(int i=0;i<flLst.size();i++){
                 if(flLst.get(i).getName().toLowerCase().contains(text)){
                     ccpt.add(flLst.get(i));
                 }

             }

            FlAdapter mAdapterx = new FlAdapter(ListFiles.this, R.layout.fl_list_item, ccpt);
            mListView.setAdapter(mAdapterx);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub

        }
    });

这个for循环遍历列表,可以使动态搜索对于太大的列表变慢。有没有办法让这更快?

我在评论的建议之后尝试了二进制搜索,但它实际上冻结了应用程序,所以我不确定我的实现是否有点,如果列表项还包含搜索到的文本作为其名称的一部分我列出了以及:

public List<File> binarySearch(ArrayList<File> array, String value)
{
    int start = 0;
    int end = array.size() - 1;

    ArrayList<File> temps = new ArrayList<File>();

    while (start <= end)
    {
        int middle = start + (end - start)/2;
        if (array.get(middle).getName().contains(value)) {
            temps.add(array.get(middle));
           // return true;
        }
        else if (array.get(middle).getName().compareTo(value)>0)
        {
            end = middle - 1;
        }
        else start = middle + 1;
    }
   return temps;
}

1 个答案:

答案 0 :(得分:0)

如果您不关心内存使用情况,则可以将flLst.get(i).getName().toLowerCase()缓存在字符串列表中,因为列表已修改。由于缓存与之间存在一个对应关系listitems然后在缓存上执行搜索并从flLst.获取项目随着越来越多的搜索执行,它会表现得更好。

修改

flLst = getYourListLigic ();
ArrayList <String> cache = new ArrayList <>();
for(int i=0;i<flLst.size();i++){
    cache.add (flLst.get(i).getName().toLowerCase());

edsearch.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

        List<File> ccpt = new ArrayList<File>();
        String text = edsearch.getText().toString().toLowerCase();

         for(int i=0;i<flLst.size();i++){
             if(cache.get(i).contains(text)){
                 ccpt.add(flLst.get(i));
             }

         }

        FlAdapter mAdapterx = new FlAdapter(ListFiles.this, R.layout.fl_list_item, ccpt);
        mListView.setAdapter(mAdapterx);
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                  int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub

    }
});