私はこれを理解しようとして夢中になっています。知っていることはすべて試しましたが、何も機能していないようです。正しい方向への助けは大歓迎です。
同じアクティビティで ボタンを押して (AsyncTask の onPreExecute() メソッドで) ProgressDialog を開始し、GalleryView に表示されるアイテムを保持する String 配列を更新すると、GalleryView が更新されません。AsyncTask の onPostExecute() で、アダプタで notifyDataSetChanged() を呼び出し、続いて GalleryView で setAdapter() を呼び出そうとしました。onPostExecute() は、UI スレッドで機能すると思います。また、runOnUiThread() で notifyDataSetChanged() と setAdapter() を呼び出してみましたが、どちらもうまくいかないようです。GalleryView は、新しいアイテムで自動的に更新されません。ビューを画面からスクロールしてから、再びスクロールした場合にのみ表示されます。そのときだけ、ビューは新しいアイテムで更新されます。
以下はコードの一部です。
ボタン クリック イベントで、AsyncTask を拡張する UpdateGalleryview で execute を呼び出す
refresh.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
UpdateGalleryview updateGalleryview=new UpdateGalleryview();
updateGalleryview.execute(GalleryView.this);
}
});
次に、UpdateGalleryview クラスの onPreExecute() メソッドで、ProgressDialog を作成し、GalleryView の Adapter に送信される配列を更新しています。
private class UpdateGalleryview extends AsyncTask<Context, Integer, String>
{
@Override
protected void onPreExecute()
{
final ProgressDialog dialog = ProgressDialog.show(GalleryView.this, "Refresh", "Loading... please wait", true);
new Thread(new Runnable(){
public void run(){
//Updating the Uri[] that is sent to the Adapter for GalleryView
File[] imagelist;
File images = new File("/sdcard/thumbs/");
imagelist = images.listFiles();
mFiles = new String[imagelist.length];
for(int i= 0 ; i< imagelist.length; i++){
mFiles[i] = imagelist[i].getAbsolutePath();
}
mUrls = new Uri[mFiles.length];
for(int i=0; i < mFiles.length; i++){
mUrls[i] = Uri.parse(mFiles[i]);
}
dialog.dismiss();
}
}).start();
Log.i( TAG, "onPreExecute()" );
super.onPreExecute();
}
次に、AsyncTask の onPostExecute() で、UI で動作する別のスレッドを呼び出しています。
@Override
protected void onPostExecute( String result )
{
runOnUiThread(updateAdapter);
// gaAdapter.notifyDataSetChanged();
// ga.setAdapter(gaAdapter);
// ga.invalidate();
// ga.setSelection(midposition);
super.onPostExecute(result);
}
上記のように、アダプタ (gaAdapter) を新しいアイテムで更新し、onPostExecute() 自体内の GalleryView (ga) を更新しようとしました。しかし、それはうまくいきませんでした。そこで、以下のように、それを行うための新しいスレッドを作成しました。
private Runnable updateAdapter = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
gaAdapter.notifyDataSetChanged();
ga.setAdapter(gaAdapter);
// ga.invalidate();
ga.setSelection(midposition);
}
};
これは私のアダプターコードです
public class ImageAdapter extends BaseAdapter {
private Context ctx;
int imageBackground;
public ImageAdapter(Context c) {
ctx = c;
TypedArray ta = obtainStyledAttributes(R.styleable.Gallery1);
imageBackground = ta.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 1);
ta.recycle();
}
@Override
public int getCount() {
return imagelist.length;
}
@Override
public Object getItem(int arg0) {
return arg0;
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
ImageView iv = new ImageView(ctx);
iv.setImageURI(mUrls[arg0]);
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
iv.setLayoutParams(new Gallery.LayoutParams(180,144));
iv.setBackgroundResource(imageBackground);
return iv;
}
}
これが私がいるところです。上記を行ってもGalleryViewは自動更新されません。