私はこのような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]を、それは奇妙に見える場合、私はいくつかの名前を隠しています。
。 c.moveToPosition(position)を使用する場合。 – Vector
Hmmm、状況を詳しく説明するために、imageDownloader.downloadはAsyncTaskを呼び出してアダプタで更新を実行しますが、問題はListActivityで私のcursoradapterを作成することです。どうすればそのカーソルにアクセスして、changecursorを呼び出すことができますか?それとも他の方法がありますか? – Maurice
カーソルに新しいデータを追加していますか?そうした場合、新しいデータで自身を更新するためにリストビューをトリガーする必要があります。次に、 'cur.notifyDataSetChanged()'を呼び出す必要があります –