1
爲了提高我的ListView
的性能,我實現了AsyncTask
來處理Cursor
上的某些操作。這是代碼。在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;
}
這樣做的問題是,在某些position
S [朝向端部和頂(示出正確地在第一,但滾動後錯)的ListView
的]的數據被顯示錯誤。我也有8 ListView
child
s但我得到的position
的最大值是4.爲什麼發生這種情況?我怎樣才能解決這個問題?
爲什麼你在這上面使用異步任務?你正在爲listview中的每一項產生一個線程,這非常低效,在你的情況下,完全沒有意義。你沒有通過使用異步任務獲得任何東西,在這種情況下,你實際上減慢了很多你的列表視圖。此外,如果您刪除異步任務,則不會遇到您遇到的問題。異步任務是用於長時間運行的任務..從遊標將字符串映射到文本視圖是一項相當即時的任務,可以留在主線程中。 – dymmeh 2012-04-23 20:16:43
@dymmeh我的'ListView'最初是生澀的,但現在在添加這個之後平滑滾動。可能與處理drawable有關,'AsyncTask'不僅映射字符串,而且調用'Runtime.exec()'(我的意思是'propmanager.mbActivePath()')等,但這裏沒有顯示。它的 – 2012-04-23 20:29:20
什麼是mbActivePath()實際上在做什麼?也好奇你爲什麼使用實際的drawable而不是指向資源drawable。也許你正在從一個網站加載它們? – dymmeh 2012-04-23 20:47:18