我是android编程的初学者,所以也许这是一个愚蠢的问题...... 我读了很多关于异步任务来添加进度条,但我找不到我需要的解决方案:
我必须显示网格视图,但我需要搜索要在其中显示的图像和文本的数据。 因此,如果我在asynctask中的数组中加载相关数据,则网格的适配器没有数据和崩溃。 否则,如果我将进度对话框放在gridview的oncreate方法中,它会等待加载数据但不显示progess栏(它只是在加载数据的末尾,而不是在它的过程中)。 所以我不知道正确的方法。
我认为从之前的活动开始只显示进度对话框,加载数据,最后开始gridview,但在我看来这不是一种经济方法......
你觉得怎么样?那么:如何从asynk任务将数据附加到适配器? 我尝试使用notyfydatasetchange但它不起作用
在我的onCreate方法中,我有: mAdapter = new ImageAdapter(this); mGrid.setAdapter(mAdapter);
但是相同的适配器构造函数需要数据...(至少对象的数量......)
这是我的适配器:
public class ImageAdapter extends BaseAdapter{
Context mContext;
public final int ACTIVITY_CREATE = dirObjList.size()*2;
public ImageAdapter(Context c){
mContext = c;
map = new HashMap<Integer,SoftReference<Bitmap>>();
}
public Map<Integer,SoftReference<Bitmap>> map;
@Override
public int getCount() {
return dirObjList.size();
}
public RowData getItem(int position) {
return dirObjList.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
RowData currDirObj= getItem(position);
if(convertView==null){
LayoutInflater li = getLayoutInflater();
convertView = li.inflate(R.layout.icon, null);
holder = new ViewHolder();
holder.tv = (TextView)convertView.findViewById(R.id.icon_text);
holder.iv = (ImageView)convertView.findViewById(R.id.icon_image);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
holder.iv=setThumbs(holder.iv,position);
holder.tv.setText(currDirObj.mTitle);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences indexPrefs = getSharedPreferences("currentIndex",
MODE_PRIVATE);
SharedPreferences.Editor indexEditor = indexPrefs.edit();
indexEditor.putInt("currentIndex", 0);
SharedPreferences drPrefs = getSharedPreferences("currentDir",
MODE_PRIVATE);
SharedPreferences.Editor drPath = drPrefs.edit();
drPath.putString("currentDir", dirObjList.get(position).mDetail);
drPath.commit();
final Intent intent = new Intent(ImageGrid.this, SpeakinGallery.class);
startActivity(intent);
}
});
return convertView;
}
}
这是我的异步任务
public class MyTask extends AsyncTask<Void, Void, String> {
ProgressDialog progress;
public MyTask(ProgressDialog progress) {
this.progress = progress;
}
public void onPreExecute() {
progress.show();
}
public String doInBackground(Void...unused) {
getSubDirs(startDIRECTORY);
return "foo";
}
public void onPostExecute(Void unused) {
progress.dismiss();
//mAdapter.notifyDataSetChanged();
}
}
答案 0 :(得分:0)
AsyncTask绝对是你的朋友。我发现在AsyncTask类中创建ProgressDialog的成员实例非常有效。假设您有一个名为MyActivity的Activity类。创建一个名为DownloadTask的内部类。
private class DownloadTask extends AsyncTask<Object, Void, Object> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(MyActivity.this, "", "Loading...");
}
@Override
protected Object doInBackground(Object... params) {
// download information and return it
return dataObject;
}
@Override
protected void onPostExecute(Object result) {
// use result object from background task and
// attach data to adapter
dialog.dismiss();
}
}
然后在你的onCreate()方法中,调用new DownloadTask().execute();