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(...);

    [...]

}