为了提高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。为什么会这样?我怎样才能解决这个问题? 最佳答案
这确实是效率低下且消耗资源的。您实际上应该在应用程序中一次使用AsyncTask
将ListView
数据加载到内存中,然后将其保存在其中并用于填充ListView
项。解决您的问题的方法是缓存,而不是在后台加载。