0

ActivitywithがGridViewあり、画像が含まれています。画像は、デバイスの SD カードから解析されます。がActivity起動すると、 を使用して画像が SD カードにダウンロードされますAsyncTask

問題は、GridView画像がダウンロードされたときにこれが更新されないことです。ディレクトリにさらに画像が追加された場合 (つまり、さらに画像がダウンロードされた場合) に、これを更新したいと考えてGridViewいます。notifyDataSetChanged()とを試しinvalidateViews()ましたが、役に立ちません。

MainActivity、Image アダプター、およびAsyncTask. どこで間違いを犯したのか教えてください。

主な活動:

ImageAdapter ia = new ImageAdapter(this);   
GridView gridView; 

@Override   
public void onCreate(Bundle savedInstanceState){  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.grid_layout);

    gridView = (GridView) findViewById(R.id.grid_view);

    // Instance of ImageAdapter Class   
    ImageAdapter iAdapter = new ImageAdapter(this);     
    gridView.setAdapter(iAdapter);      
    iAdapter.notifyDataSetChanged();
    gridView.invalidateViews();
    new ImageDownlader(AndroidGridLayoutActivity.this, this).execute(downloadUrl);
    gridView.setOnItemClickListener(new OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {

            // Sending image id to FullScreenActivity
            Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
            // passing array index
            i.putExtra("id", position);
            startActivity(i);
        }
    });     

getView()イメージ アダプターの数:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         ImageView imageView = new ImageView(mContext);
         imageView.setImageBitmap(getImageByIndex(imageThumbnails, position));
         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         imageView.setLayoutParams(new GridView.LayoutParams(155, 155));
         return imageView;
    }

画像ダウンローダー:

class ImageDownlader extends AsyncTask<String, Void, Void> {
    private Context context;
    public ImageDownlader(Context c){
    context = c;
}


Sync s = new Sync();

@Override
protected Void doInBackground(String... param) {
        // this is where images are downloaded to SD card
    saveToSD ();
    return null;
}

@Override
protected void onPreExecute() {
    Log.i("Async-Example", "onPreExecute Called");
}

protected void onPostExecute()
{
    Log.i("Async-Example", "onPostExecute Called");
}
4

1 に答える 1

1

最初に、URL から画像をダウンロードして返す必要があります。

import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = bmImage;
      }

      protected Bitmap doInBackground(String... urls) {
          String urldisplay = urls[0];
          Bitmap mIcon11 = null;
          try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
          } catch (Exception e) {
              Log.e("Error", e.getMessage());
              e.printStackTrace();
          }
          return mIcon11;
      }

      protected void onPostExecute(Bitmap result) {
          bmImage.setImageBitmap(result);
      }
}   

次に、アダプタを作成します

import java.util.List;

import vn.mve.obj.Video;
import vn.mve.util.DownloadImageTask;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import vn.mve.e4u.Detail;
import vn.mve.e4u.R;

public class VideoAdapter extends BaseAdapter {
    private List<Video> list;
    private Context context;
    private LayoutInflater inflater;
    public VideoAdapter(Context context, List<Video> list) {
        this.context = context;
        this.list = list;
        inflater = LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = inflater.inflate(R.layout.layout_video_gridview, parent, false);
        ImageView iv_thumb = (ImageView) view.findViewById(R.id.iv_thumb);
        new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());

        TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
        tv_title.setText(list.get(position).getTitle());

        LinearLayout item = (LinearLayout) view.findViewById(R.id.item);
        item.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, Detail.class);
                intent.putExtra("ID", list.get(position).getId());
                context.startActivity(intent);
            }
        });
        return view;
    }

}

ここに:

new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());

DownloadImageTask のインスタンスを作成できます。その後、そのようなイメージを取得できます。

imageTask = new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());
Bitmap myImage = imageTask.get(); // Please put in try-catch

最後に、MainActivityで

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<Video> list = null;
    MVideo mVideo = new MVideo(getApplicationContext());
    list = mVideo.getList(VideoType.GET_ALL);
    VideoAdapter adapter = new VideoAdapter(this, list);
    if (list != null) {
        GridView gvVideo = (GridView) findViewById(R.id.gv_video);
        gvVideo.setAdapter(adapter);
    }
}

これがあなたを助けることを願っています!

于 2013-06-10T09:55:59.953 に答える