2011-07-21 6 views
0

私はこのようなgetViewメソッドを持つカスタムSimpleCursorAdapterていますAndroid changecursorとはどこですか?

public View getView(int position, View convertView, ViewGroup parent) { 
    //this.changeCursor(c); tried this didn't work. 
    this.c.moveToPosition(position); 
    int urlCol = c.getColumnIndex("url"); 
    final String url = c.getString(urlCol); 
    //other code stuff. 
    imageDownloader.download(url, thumbnail, rowId, db,pb); 

imageDownloaderはDBAdapterの更新を呼び出しますが、c.getString(urlCol)はまだ私の前の値を与えます。私は上記の位置にchangeCursorを入れてみましたが、私はまだ同じ値を持っています。どこで私はこれを正確に呼ぶべきですか?ありがとう!

私は実際にListVIewを再描画したくありません。私はちょうど最新のデータをカーソルに入れたいと思っています。私は自分のimageviewとURLをImageDownloaderクラスに渡してイメージをダウンロードし、ビットマップをイメージビューに設定してデータベースを更新します。 getViewメソッドが私に同じデータを返すので、カーソルが更新されていないことに気付きました。

これは私のカスタムsimplecursoradapter宣言です。 getviewは上記のとおりです。

public class MessagesCursorAdapter extends SimpleCursorAdapter { 

private final ImageDownloader imageDownloader = new ImageDownloader(); 

ImageDownloaderクラス

public void download(String url, ImageView imageView, int rowId, 
     TestDbAdapter db,ProgressBar pb) { 

//url can be a http:// or /mnt/sdcard/mnt/ etc etc 
//some lenghty code to check if it exists physically on the phone. else.... 
forceDownload(url, imageView, rowId, db,pb); 

private void forceDownload(String url, ImageView imageView, int rowId, 
     TestDbAdapter db,ProgressBar pb) { 

    BitmapDownloaderTask task = new BitmapDownloaderTask(imageView, rowId, 
      db,pb); 

AsyncTaskクラスImageDownloaderクラスの

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
    private String url; 
    private int rowId; 
    private TestDbAdapter db; 
    private ProgressBar pb; 
    private final WeakReference<ImageView> imageViewReference;  
    public BitmapDownloaderTask(ImageView imageView, int rowId, 
      TestDbAdapter db,ProgressBar pb) { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
     this.rowId = rowId; 
     this.db = db;   
     this.pb = pb; 
    } 


    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     pb.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) {   
     url = params[0]; 
     return downloadBitmap(url); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 

     if (isCancelled()) { 
      bitmap = null; 
     } 

     if (imageViewReference != null) { 
      ImageView imageView = imageViewReference.get(); 
      BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView); 

      if ((this == bitmapDownloaderTask)) { 
       int pos = url.lastIndexOf("/"); 
       String fileName = url.substring(pos, url.length()); 
       System.out.println(fileName); 

       String extLoc = Environment.getExternalStorageDirectory() 
         + "/Test"; 

       File folder = new File(extLoc); 
       if (!folder.exists()) { 
        folder.mkdir(); 
       } 

       try { 
        FileOutputStream out = new FileOutputStream(extLoc 
          + fileName); 


        boolean result = db.updateMessageUrl(rowId, extLoc + fileName); 
//should update cursor here, purpose is to change the url link to a physical location on the phone. 

        bitmap.compress(Bitmap.CompressFormat.JPEG, 95, out); 

        BitmapFactory.Options options = new BitmapFactory.Options(); 
        options.inTempStorage = new byte[24 * 1024]; 
        options.inJustDecodeBounds = false; 
        options.inSampleSize = 2; 

        Bitmap thumbnail = BitmapFactory.decodeFile(extLoc 
          + fileName, options); 


        imageView.setImageBitmap(bitmap); 

        addBitmapToCache(url, bitmap); 

        pb.setVisibility(View.GONE); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

[OK]を、それは奇妙に見える場合、私はいくつかの名前を隠しています。

答えて

0

最初に実行します。

c.moveToFirst(); 

は、アクセスする前に、すべてのデータは、あなたがしたい残りの部分を行います。あなたの場合はc.moveToFirst()に電話し、getView()ではなく、外に出ます。なぜなら、getView()はポピュレートを実行するときに何度も呼び出されるからです。おそらく、カーソルを戻しているメソッドで呼び出すようにしてください。

アクセスするときは、次のデータのカーソルを移動するのを忘れないでください。c.moveToNext();これはgetView()内で行う必要があります。

+0

。 c.moveToPosition(position)を使用する場合。 – Vector

+0

Hmmm、状況を詳しく説明するために、imageDownloader.downloadはAsyncTaskを呼び出してアダプタで更新を実行しますが、問題はListActivityで私のcursoradapterを作成することです。どうすればそのカーソルにアクセスして、changecursorを呼び出すことができますか?それとも他の方法がありますか? – Maurice

+0

カーソルに新しいデータを追加していますか?そうした場合、新しいデータで自身を更新するためにリストビューをトリガーする必要があります。次に、 'cur.notifyDataSetChanged()'を呼び出す必要があります –

0

私はあなたのCursorAdapterの設定方法にはうまく対応していません。

ListActivityからAsyncTaskを1回だけ実行する必要があります。たぶんAsyncTaskは、データベースのダウンロードを待っているデータベースのすべてのイメージをダウンロードしていますか? onProgressUpdateを使用してListActivity内のメソッドを呼び出して、notifyDataSetchanged()を実行できます。

notifyDataSetChanged()とnotifyDataSetInvalidated()が必要です。あなたのasyncTask onPostExecuteメソッドはListActivityに新しい/更新されたカーソルを返し、次にListActivity呼び出しnotifyDataSetchanged()とnotifyDataSetInvalidatedから呼び出します。

編集:あなたはc.moveToFirst()を呼び出す必要はありません Same question as this.

+0

まず、アダプター内のデータを使ってカーソルに新しいデータを適用してから、リストビューに信号を送信して再投入しなければなりません。 –

+0

私のAsyncTaskは現在、ダウンロード後にBitMapを返し、イメージビューでそれを設定します。その後、dbAdapterを更新します。カーソルを戻してもgetViewメソッドに移りますが、これをどのようにリストア処理に戻しますか? – Maurice

+0

[AsyncTask onPostExecute](http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result))は、UIスレッドで実行されます。 onPostExecuteからListActivity内のメソッドを呼び出すことができます。 – Vector

関連する問題