0

私はこれを理解しようとして夢中になっています。知っていることはすべて試しましたが、何も機能していないようです。正しい方向への助けは大歓迎です。

同じアクティビティで ボタンを押して (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は自動更新されません。

4

1 に答える 1

3

アダプターを初めて作成するときに使用するアレイを更新する必要があります。おそらく、クラスでそれへの参照を保持する必要があります。その配列を更新してから、を呼び出しますnotifyDataSetChanged

于 2011-11-16T20:40:33.373 に答える