Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView未使用notifyDataSetChanged()更新_Android_Gridview_Android Asynctask_Android Gridview_Notifydatasetchanged - Fatal编程技术网

Android GridView未使用notifyDataSetChanged()更新

Android GridView未使用notifyDataSetChanged()更新,android,gridview,android-asynctask,android-gridview,notifydatasetchanged,Android,Gridview,Android Asynctask,Android Gridview,Notifydatasetchanged,我有一个带有GridView的活动,里面有图像。从设备的SD卡解析图像。活动启动后,使用AsyncTask将图像下载到SD卡 问题是下载图像时,此GridView不会得到更新如果目录中添加了更多图像(即,如果下载了更多图像),我希望更新此GridView。我已经尝试了notifyDataSetChanged()和invalidateViews(),但是它们没有帮助 这是我的main活动、映像适配器和AsyncTask的代码。请试着告诉我哪里出了错 主要活动: ImageAdapter ia =

我有一个带有
GridView
活动
,里面有图像。从设备的SD卡解析图像。
活动启动后,使用
AsyncTask
将图像下载到SD卡

问题是下载图像时,此
GridView
不会得到更新如果目录中添加了更多图像(即,如果下载了更多图像),我希望更新此
GridView
。我已经尝试了
notifyDataSetChanged()
invalidateViews()
,但是它们没有帮助

这是我的main活动、映像适配器和
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);
        }
    });     
图像下射器:

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");
}
类ImageDownlader扩展异步任务{
私人语境;
公共图像下载器(上下文c){
上下文=c;
}
Sync s=新同步();
@凌驾
受保护的Void doInBackground(字符串…参数){
//这是图像下载到SD卡的地方
saveToSD();
返回null;
}
@凌驾
受保护的void onPreExecute(){
i(“异步示例”,“调用onPreExecute”);
}
受保护的void onPostExecute()
{
i(“异步示例”,“调用onPostExecute”);
}

首先,您应该从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);
      }
}   
您可以创建DownloadImageTask的实例,然后您可以获得如下图像:

imageTask = new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());
Bitmap myImage = imageTask.get(); // Please put in try-catch
最后,在main活动中

@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);
    }
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List=null;
MVideo MVideo=新的MVideo(getApplicationContext());
list=mVideo.getList(VideoType.GET_ALL);
VideoAdapter=新的VideoAdapter(此,列表);
如果(列表!=null){
GridView gvVideo=(GridView)findViewById(R.id.gv_video);
gvVideo.setAdapter(适配器);
}
}

希望这将对您有所帮助!

notifyDataSetChanged();当您要更新视图适配器时使用此选项。在哪个事件上您要更新适配器..u将其写入OnCreate();是的,我在以下主要活动中使用了它:iAdapter.notifyDataSetChanged();@Ganesh,我想在AsyncTask完成后更新它。更准确地说,当通过AsyncTask下载将新映像添加到SD卡目录时。然后在AsyncTask完成后更新它。在您的代码中,您可以在之前更新它。或者在onResume()中更新它;谢谢,我会看一看。在您的示例中,当添加新数据集时,gridview会更新吗?是的,它工作了,但我的代码结构非常不同。因此我无法在我的应用程序中实现它。
new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());
imageTask = new DownloadImageTask(iv_thumb).execute(list.get(position).getThumbnail());
Bitmap myImage = imageTask.get(); // Please put in try-catch
@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);
    }
}