我已经能够使用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;
}
答案 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
}
});