1

パフォーマンスを向上させるために、でいくつかの操作を処理ListViewするためにを実装しました。これがコードです。AsyncTaskCursor

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]、データが正しく表示されないことです。また、私は8ListView child秒ですが、取得する最大値positionは4です。なぜこれが発生するのですか?どうすればこれを修正できますか?

4

1 に答える 1

1

これは本当に非効率的でリソースを消費します。AsyncTaskアプリケーションで一度使用してListViewデータをメモリにロードし、そこに保持してListViewアイテムを埋めるために使用する必要があります。問題の解決策は、バックグラウンドでロードする代わりにキャッシュすることです。

于 2012-04-24T01:48:33.807 に答える