为了提高ListView的性能,我实现了AsyncTask来处理Cursor上的某些操作。这是代码。

public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.row, null);
        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.name);
        holder.desc = (TextView) convertView.findViewById(R.id.desc);
        holder.status = (TextView) convertView.findViewById(R.id.status);
        holder.path = (TextView) convertView.findViewById(R.id.path);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
        holder.position = position;
        convertView.setTag(holder);
        Log.d(Tag.getTag(this), "convertView is null");
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    class CursorTask extends AsyncTask<ViewHolder, Void, String[]> {
        private ViewHolder v;
        private String vdstatus, mbpath, vsname, vsdesc, vsstatus, vspath;
        String iconid;
        @Override
        protected String[] doInBackground(ViewHolder... params) {
            v = params[0];
            Cursor mCursor = getCursor();
            mCursor.moveToPosition(position);
            String[] mArray = new String[] { mCursor.getString(1),
                    mCursor.getString(2), mCursor.getString(5),
                    mCursor.getString(7), mCursor.getString(6),
                    sdpath + propmanager.mbActivePath(),
                    mCursor.getString(4) };
            return mArray;
        }

        @Override
        protected void onPostExecute(String[] mArray) {
            super.onPostExecute(mArray);
            vsname = mArray[0];
            vsdesc = mArray[1];
            vsstatus = mArray[2];
            vspath = mArray[3];
            vdstatus = mArray[4];
            mbpath = mArray[5];
            iconid = mArray[6];
            if (v.position == position) {
                v.name.setText(vsname);
                v.desc.setText(vsdesc);
                v.status.setText(vsstatus);
                v.path.setText(vspath);
                switch (Integer.parseInt(iconid)) {
                case 0: {
                    v.icon.setImageDrawable(drawable_a2s);
                    break;
                }
                .................
                .................
                .................
                case 17: {
                    v.icon.setImageDrawable(drawable_cid);
                    break;
                }
                }
                if (vdstatus == "false") {
                    v.status.setTextColor(Color.RED);
                } else {
                    v.status.setTextColor(Color.parseColor("#4B8A08"));
                }
                if (mbpath.equals(vspath)) {
                    v.name.setTextColor(Color.RED);
                }
            }
        }
    }
    new CursorTask().execute(holder);
    return convertView;
}

static class ViewHolder {
    ImageView icon;
    TextView name, desc, status, path;
    int position;
}


问题是在某些position中[朝着ListView的结尾和顶部(首先正确显示,但在滚动后显示错误)],数据显示错误。我也有8个ListView child,但是得到的position最大值是4。为什么会这样?我怎样才能解决这个问题?

最佳答案

这确实是效率低下且消耗资源的。您实际上应该在应用程序中一次使用AsyncTaskListView数据加载到内存中,然后将其保存在其中并用于填充ListView项。解决您的问题的方法是缓存,而不是在后台加载。

10-07 19:23
查看更多