1
私のListView
のパフォーマンスを改善するために、Cursor
でいくつかの操作を処理するためにAsyncTask
を実装しました。ここにコードがあります。SimpleCursorAdapterでのAsyncTaskの使用
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;
}
これに伴う問題は、[ListView
の(スクロール後の最初のが、間違った時に正しく示す)の端部と上部に向かっていくつかのposition
Sでデータが間違った表示されることです。また、私は8 ListView
child
sを持っていますが、最大値はposition
です。私は4になっています。これはなぜ起こっていますか?これをどうすれば解決できますか?
なぜこれで非同期タスクを使用していますか?リストビュー内のすべての単一項目に対してスレッドを生成していますが、これは非常に効率が悪く、場合によっては完全に無意味です。あなたは非同期タスクを使用して何も得ていないので、実際にはリストビューを全体的に遅くしています。また、非同期タスクを削除しても、問題は発生しません。非同期タスクは、長時間実行されるタスクのためのものです。文字列をカーソルからテキストビューにマッピングすることは、かなり瞬間的な作業であり、メインスレッドに残すことができます。 – dymmeh
@dymmeh私の 'ListView'は、最初はぎこちなくなっていましたが、これを追加した後はスムーズにスクロールしました。 'AsyncTask'は文字列をマップするだけでなく' Runtime.exec() '(私は' propmanager.mbActivePath() ')などを呼び出しますが、これはここには示されていません。その –
mbActivePath()は実際に何をしていますか?また、なぜあなたがリソースdrawableを指すのではなく、実際のdrawableを使用しているのか不思議です。たぶんあなたはそれらをウェブサイトからロードしていますか? – dymmeh