Android 在baseadapter中使用异步任务加载文件缩略图的listview
我正在尝试将图片文件列表从设备存储器加载到用户可以交互的列表视图。我目前正在使用一个视图持有者模式来清理滚动,但这似乎是不够的,因为列表中的图片越多,滚动就越频繁。我已经研究过使用异步任务,但不熟悉如何使用它来填充包含baseadapter的缩略图列表视图 这些是我在listview中拥有的对象类型。每个项目都是在另一个类中定义的“自拍”对象 以下是我从BaseAdapter获得的getView:Android 在baseadapter中使用异步任务加载文件缩略图的listview,android,listview,android-asynctask,baseadapter,Android,Listview,Android Asynctask,Baseadapter,我正在尝试将图片文件列表从设备存储器加载到用户可以交互的列表视图。我目前正在使用一个视图持有者模式来清理滚动,但这似乎是不够的,因为列表中的图片越多,滚动就越频繁。我已经研究过使用异步任务,但不熟悉如何使用它来填充包含baseadapter的缩略图列表视图 这些是我在listview中拥有的对象类型。每个项目都是在另一个类中定义的“自拍”对象 以下是我从BaseAdapter获得的getView: @Override public View getView(int position, View
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.v(TAG, "in getView for position " + position +
", convertView is " +
((convertView == null)?"null":"being recycled"));
View newView = convertView;
ViewHolder holder;
if (null == convertView) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
newView = inflater.inflate(R.layout.single_item, null);
holder = new ViewHolder();
holder.description = (TextView) newView.findViewById(R.id.textView1);
holder.picture = (ImageView) newView.findViewById(R.id.imageView1);
newView.setTag(holder);
} else {
holder = (ViewHolder) newView.getTag();
}
holder.picture.setScaleType(ImageView.ScaleType.CENTER_CROP);
SelfieObject selfie = (SelfieObject) getItem(position);
setPic(holder.picture, new Point(WIDTH, HEIGHT), selfie.getPath());
TextView textView = (TextView) holder.description;
textView.setText(selfie.getName());
return newView;
}
static class ViewHolder {
ImageView picture;
TextView description;
以下是我希望从开发人员站点使用的异步代码:
new AsyncTask<ViewHolder, Void, Bitmap>() {
private ViewHolder v;
@Override
protected Bitmap doInBackground(ViewHolder... params) {
v = params[0];
return mFakeImageLoader.getImage();
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (v.position == position) {
// If this item hasn't been recycled already, hide the
// progress and set and show the image
v.progress.setVisibility(View.GONE);
v.icon.setVisibility(View.VISIBLE);
v.icon.setImageBitmap(result);
}
}
}.execute(holder);
newasynctask(){
私人持票人v;
@凌驾
受保护的位图背景(ViewHolder…参数){
v=参数[0];
返回MFakeMageLoader.getImage();
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(v.position==位置){
//如果此物品尚未回收,请隐藏
//前进,设置并显示图像
v、 progress.setVisibility(View.GONE);
v、 icon.setVisibility(View.VISIBLE);
v、 icon.setImageBitmap(结果);
}
}
}.执行(持有人);
有人能告诉我如何在BaseAdapter中实现这一点的正确方向吗?对于我正在做的事情来说,Android开发代码似乎过于通用 您应该扩展AsyncTask类,例如:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute() */
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** The system calls this to perform work in the UI thread and delivers
* the result from doInBackground() */
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
public void onClick(视图v){
新建DownloadImageTask()。执行(“http://example.com/image.png");
}
私有类DownloadImageTask扩展了AsyncTask{
/**系统调用它以在工作线程中执行工作,并
*将给定给AsyncTask.execute()的参数传递给它*/
受保护位图doInBackground(字符串…URL){
从网络返回loadImageFromNetwork(URL[0]);
}
/**系统调用它来执行UI线程中的工作,并提供
*doInBackground()的结果*/
受保护的void onPostExecute(位图结果){
设置图像位图(结果);
}
}
使用您所说的单独类是更好的做法吗?我懂了。我知道您提供的代码只是一个示例,但如何使用AsyncTask与加载位图或imageview交互?提前谢谢!这不是一个更好的练习-它是必须的!AsyncTask是一个抽象类,这意味着如果不扩展到另一个类,它就不能作为自身使用。回到您的问题:您可以在“doInBackground”类中加载图像,并以位图的形式返回值。然后在ImageView中使用位图,就像我刚才在那里展示的示例一样。如果您确实需要一个分步教程,您可以按照以下步骤操作: