2012-04-23 9 views
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 ListViewchild sを持っていますが、最大値はpositionです。私は4になっています。これはなぜ起こっていますか?これをどうすれば解決できますか?

+0

なぜこれで非同期タスクを使用していますか?リストビュー内のすべての単一項目に対してスレッドを生成していますが、これは非常に効率が悪く、場合によっては完全に無意味です。あなたは非同期タスクを使用して何も得ていないので、実際にはリストビューを全体的に遅くしています。また、非同期タスクを削除しても、問題は発生しません。非同期タスクは、長時間実行されるタスクのためのものです。文字列をカーソルからテキストビューにマッピングすることは、かなり瞬間的な作業であり、メインスレッドに残すことができます。 – dymmeh

+1

@dymmeh私の 'ListView'は、最初はぎこちなくなっていましたが、これを追加した後はスムーズにスクロールしました。 'AsyncTask'は文字列をマップするだけでなく' Runtime.exec() '(私は' propmanager.mbActivePath() ')などを呼び出しますが、これはここには示されていません。その –

+0

mbActivePath()は実際に何をしていますか?また、なぜあなたがリソースdrawableを指すのではなく、実際のdrawableを使用しているのか不思議です。たぶんあなたはそれらをウェブサイトからロードしていますか? – dymmeh

答えて

1

これは実際には非効率的でリソースを消費します。実際にAsyncTaskをアプリケーションで使用して、ListViewデータをメモリに読み込んだ後、そこに保管して、ListViewの項目を記入してください。問題の解決方法は、の代わりにをキャッシングすることです。です。

関連する問題