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);
}
}