Android 我的自定义列表视图太滞后
我正在做一个文件管理员。它的用户界面类似于根浏览器的用户界面。Android 我的自定义列表视图太滞后,android,performance,android-listview,Android,Performance,Android Listview,我正在做一个文件管理员。它的用户界面类似于根浏览器的用户界面。 但是我在我的文件管理器中添加了根访问权限,因此我的自定义listview非常滞后。 我找了很多,但还没修好 FileAdapter类的代码: public class FileAdapter extends BaseAdapter { private ArrayList<RootFileProperty> object; ImageLoader loader = new ImageLoader(getAp
但是我在我的文件管理器中添加了根访问权限,因此我的自定义listview非常滞后。
我找了很多,但还没修好 FileAdapter类的代码:
public class FileAdapter extends BaseAdapter {
private ArrayList<RootFileProperty> object;
ImageLoader loader = new ImageLoader(getApplicationContext());
boolean isScrolling = false;
public FileAdapter(ArrayList<RootFileProperty> object) {
super();
this.object = object;
}
@Override
public int getCount() {
return object.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(RootActivity.this);
convertView = inflater.inflate(R.layout.rootrow, parent, false);
holder = new ViewHolder();
// Find View
holder.fileicon = (ImageView) convertView.findViewById(R.id.icon);
holder.filename = (TextView) convertView.findViewById(R.id.filename);
holder.filedate = (TextView) convertView.findViewById(R.id.filedate);
holder.fileperm = (TextView) convertView.findViewById(R.id.fileperm);
holder.filesize = (TextView) convertView.findViewById(R.id.filesize);
holder.check = (ImageView) convertView.findViewById(R.id.check);
convertView.setTag(holder);
}
else holder = (ViewHolder) convertView.getTag();
String filename = object.get(position).getName();
String filedate = object.get(position).getDate();
String fileperm = object.get(position).getPerm();
String filesize = object.get(position).getSize();
String txtPerm = fileperm.equals("") ? "" : fileperm + " [" + Integer.toString(calcPerm(fileperm)) + "]";
String dir = nowPath.equals(root) ? nowPath + object.get(position).getName() : nowPath + "/" + object.get(position).getName();
if(new RootFile(dir).isDirectory()) holder.fileicon.setImageDrawable(Folder);
else
{
String file = getExtension(new RootFile(dir));
String mimeType = getMIME(file);
if (file.equals("zip") ||
file.equals("7z") ||
file.equals("rar") ||
file.equals("tar")) holder.fileicon.setImageDrawable(Compressed);
else if(mimeType == null) holder.fileicon.setImageDrawable(Others);
else if(mimeType.startsWith("image")) holder.fileicon.setImageDrawable(Image);
else if(mimeType.startsWith("audio")) holder.fileicon.setImageDrawable(Audio);
else if(file.equals("apk") && !isScrolling)
{
Bitmap b = ((BitmapDrawable) getApkIcon(dir)).getBitmap();
loader.DisplayImage(object.get(position).getName(), b, holder.fileicon);
}
else if(file.equals("apk") && isScrolling)
{
holder.fileicon.setImageResource(R.drawable.android);
}
}
holder.filename.setText(filename);
holder.filedate.setText(filedate);
holder.fileperm.setText(txtPerm);
holder.filesize.setText(filesize);
holder.check.setVisibility(isSelected[position]);
return convertView;
}
}
static class ViewHolder {
ImageView fileicon;
TextView filename;
TextView filedate;
TextView fileperm;
TextView filesize;
ImageView check;
}
我的ImageLoader类类似于。您应该知道,在时间关键的过程中创建新的对象实例对性能非常不利。因此,我们必须避免:
String mystring = new String();
事实上,如图所示,字符串连接:
String txtPerm = fileperm.equals("") ? "" : fileperm + " [" + Integer.toString(calcPerm(fileperm)) + "]";
将由编译器转到:
StringBuilder sb = new StringBuilder(100); //bad for performances
return sb.append("fileperm ").append("[" ).append(...);
您应该一次性创建自己的StringBuilder实例,并在每个字符串连接操作中重用它:
//global field
StringBuilder sb = new StringBuilder(100);
//any function that use concatenation
public String anyFunction(){
[...]
sb.clear(); //this is the trick : you don't creat new instance but clear the previous one to reuse it.
String result = sb.append(fileperm)
.append('[')
.append(...);
[...]
}
那么应该更好。我认为您在getView()方法中做了太多检查。尽量使代码尽可能小。这将为每一行和每一个卷轴触发。@rahul但我尽可能地简化了这个逻辑。。。您知道如何进一步优化此逻辑吗?请检查您是否将其应用于任何字符串连接,并将其应用于“new RootFile(dir)”=>不需要在每次调用时创建。
String txtPerm = fileperm.equals("") ? "" : fileperm + " [" + Integer.toString(calcPerm(fileperm)) + "]";
StringBuilder sb = new StringBuilder(100); //bad for performances
return sb.append("fileperm ").append("[" ).append(...);
//global field
StringBuilder sb = new StringBuilder(100);
//any function that use concatenation
public String anyFunction(){
[...]
sb.clear(); //this is the trick : you don't creat new instance but clear the previous one to reuse it.
String result = sb.append(fileperm)
.append('[')
.append(...);
[...]
}