2012-04-23 45 views
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 ListViewchild s但我得到的position的最大值是4.爲什麼發生這種情況?我怎樣才能解決這個問題?

+0

爲什麼你在這上面使用異步任務?你正在爲listview中的每一項產生一個線程,這非常低效,在你的情況下,完全沒有意義。你沒有通過使用異步任務獲得任何東西,在這種情況下,你實際上減慢了很多你的列表視圖。此外,如果您刪除異步任務,則不會遇到您遇到的問題。異步任務是用於長時間運行的任務..從遊標將字符串映射到文本視圖是一項相當即時的任務,可以留在主線程中。 – dymmeh 2012-04-23 20:16:43

+1

@dymmeh我的'ListView'最初是生澀的,但現在在添加這個之後平滑滾動。可能與處理drawable有關,'AsyncTask'不僅映射字符串,而且調用'Runtime.exec()'(我的意思是'propmanager.mbActivePath()')等,但這裏沒有顯示。它的 – 2012-04-23 20:29:20

+0

什麼是mbActivePath()實際上在做什麼?也好奇你爲什麼使用實際的drawable而不是指向資源drawable。也許你正在從一個網站加載它們? – dymmeh 2012-04-23 20:47:18

回答

1

這實在是效率低下和資源消耗。您應該在應用程序中真正使用AsyncTask將您的ListView數據加載到內存中,然後將其保存並用於填充ListView項目。針對您的問題的解決方案是緩存而不是在後臺加載