此自定义适配器加载的图像位于错误的位置,即正确的电影横幅未放置在正确的列表视图项目中。并继续改变一段时间。 这是我的ASYNCTASK自定义适配器,它正在从URL
加载图像 import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androlizer.yify.torrent.R;
import androlizer.yify.torrents.models.UpcomingMovieListModel;
public class UpcomingMoviesCustomAdapter extends ArrayAdapter<UpcomingMovieListModel> {
Context context;
public UpcomingMoviesCustomAdapter(
Context context, int resource, List<UpcomingMovieListModel> objects) {
super(context, resource, objects);
this.context = context;
}
static class ViewHolder
{
TextView movieTitle_textView;
TextView uploader_textView;
TextView date_textView;
ImageView movie_icon_imageView;
ImageView imdb_url_imageView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
// getting data
final UpcomingMovieListModel movie = getItem(position);
if (convertView == null)
{
convertView = View.inflate(context, R.layout.movie_upcoming_row, null);
holder = new ViewHolder();
holder.movieTitle_textView = (TextView) convertView.findViewById(R.id.movie_upcoming_movie_title);
holder.uploader_textView = (TextView) convertView.findViewById(R.id.movie_upcoming_uploader);
holder.date_textView = (TextView) convertView.findViewById(R.id.movie_upcoming_date);
holder.imdb_url_imageView = (ImageView)convertView.findViewById(R.id.movie_upcoming_imageView_imdblink);
holder.movie_icon_imageView = (ImageView)convertView.findViewById(R.id.movie_upcoming_movie_image_view);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
if (movie != null)
{
holder.movieTitle_textView.setText(movie.getM_title());
holder.uploader_textView.setText(movie.getUploader());
SimpleDateFormat origFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//Store it as a date object
Date date = null;
try {
date = origFormat.parse(movie.getDate_added());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Output it as a string that uses the new format
SimpleDateFormat newFormat= new SimpleDateFormat("MMMMMMMMM dd, yyyy 'at' hh:mm a");
String desiredDateFormat = newFormat.format(date);
holder.date_textView.setText(desiredDateFormat);
holder.imdb_url_imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(movie.getImdb_url())));
}
});
}
new ImageLoader().execute(convertView.g, movie.getM_cover());
return convertView;
}
public class ImageLoader extends AsyncTask<Object, String, Bitmap> {
private View view;
private Bitmap bitmap = null;
@Override
protected Bitmap doInBackground(Object... parameters) {
// Get the passed arguments here
view = (View) parameters[0];
String uri = (String)parameters[1];
// Create bitmap from passed in Uri here
// ...
try {
URL req = new URL(uri);
bitmap = BitmapFactory.decodeStream(req.openConnection()
.getInputStream());
} catch (Exception e) {
// TODO: handle exception
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null && view != null) {
ImageView splash = (ImageView) view.findViewById(R.id.movie_upcoming_movie_image_view);
splash.setImageBitmap(bitmap);
}
}
}
}
答案 0 :(得分:2)
我认为问题在于,当重复使用列表项时,您不会停止先前的ImageLoader
:当重新使用列表项时,会附加另一个ImageLoader
但不删除之前的那个被附加到相同的列表项实例。
因为这可能发生,第一个ImageLoader
可以在最后一个设置错误图像之后完成其工作。此外,您需要缓存下载的图像,否则已下载的图像将再次下载。
正确的做法(TM)应该是在与列表项相关的holder
实例中设置图像位图,而是停止加载器,使其作用于holder
。 / p>
答案 1 :(得分:0)
这里发生的是您正在加载图像并将它们设置为当前列表项的ImageView,但不将其存储在其他任何位置。 Android中的ListItems被重用,因此当您滚动时,设备不必在内存中存储许多ListItem。因此,操作系统会在您滚动时将新图像设置到列表项目中,这不是您想要的图像。
解决方案是将Bitmaps存储在支持ListView的ArrayList中。在这种情况下,List<UpcomingMovieListModel> objects
保存列表视图的数据。这里需要进行一些更改,因此我不打算提供完整的代码,但我将描述该过程。
UpcomingMovieListModel
对象扩展为名为movieIcon
的字段。UpcomingMovieListModel
对象传递给AsyncTask,并将AsyncTask设置为movieIcon
到下载的图像。getView
方法中,如果ImageView不为空,请将其设置为movie.movieIcon
的值。onPostExecute
电话AsyncTask
中this.notifyDataSetChanged()
。{这告诉ListView你已经更改了基础数据,它应该刷新以显示屏幕上每个项目中当前电影的图标。setImageBitmap
。当您通知数据集已更改时,将在getView中处理此问题。 如果你改变这些东西,你应该看到所有正确的图像,因为你将正确地存储它们用于基础数据。