Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 asyntask自定义适配器在错误位置加载图像_Android_Android Asynctask - Fatal编程技术网

Android asyntask自定义适配器在错误位置加载图像

Android asyntask自定义适配器在错误位置加载图像,android,android-asynctask,Android,Android Asynctask,此自定义适配器加载的图像放置在错误的位置,即正确的电影标题未放置在正确的列表视图项中。并持续改变了一段时间。 这是我使用ASYNCTASK的自定义适配器,它正在从URL加载图像 import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; i

此自定义适配器加载的图像放置在错误的位置,即正确的电影标题未放置在正确的列表视图项中。并持续改变了一段时间。 这是我使用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);          
                }
            }
        }
    }
import java.net.URL;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.List;
导入android.content.Context;
导入android.content.Intent;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
进口androlizer.yify.torrent.R;
导入androlizer.yify.torrents.models.UpcomingMovieListModel;
公共类UpcomingMoviesCustomAdapter扩展了ArrayAdapter{
语境;
公共上传电影自定义适配器(
上下文、int资源、列表对象){
超级(上下文、资源、对象);
this.context=上下文;
}
静态类视窗夹
{
TextView movieTitle_TextView;
TextView上传程序\u TextView;
文本视图日期\u文本视图;
ImageView电影\图标\图像视图;
ImageView imdb\u url\u ImageView;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终持票人;
//获取数据
最终升级MovieListModel movie=getItem(位置);
if(convertView==null)
{
convertView=View.inflate(上下文,R.layout.movie\u行,空);
holder=新的ViewHolder();
holder.movieTitle\u textView=(textView)convertView.findViewById(R.id.movie\u coming\u movie\u title);
holder.uploader\u textView=(textView)convertView.findViewById(R.id.movie\u uploader);
holder.date\u textView=(textView)convertView.findViewById(R.id.movie\u coming\u date);
holder.imdb\u url\u imageView=(imageView)convertView.findviewbyd(R.id.movie\u moview\u imageView\u imdblink);
holder.movie\u icon\u imageView=(imageView)convertView.findviewbyd(R.id.movie\u movie\u image\u view);
convertView.setTag(支架);
}
其他的
{
holder=(ViewHolder)convertView.getTag();
}
如果(电影!=null)
{
holder.movieTitle_textView.setText(movie.getM_title());
holder.uploader_textView.setText(movie.getUploader());
SimpleDateFormat origFormat=新的SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”);
//将其存储为日期对象
日期=空;
试一试{
date=origFormat.parse(movie.getDate_added());
}捕获(解析异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//将其输出为使用新格式的字符串
SimpleDateFormat newFormat=新的SimpleDateFormat(“mmmmmmmm dd,yyyy”在“hh:mm a”);
字符串desiredDateFormat=newFormat.format(日期);
holder.date_textView.setText(所需的日期格式);
holder.imdb\u url\u imageView.setOnClickListener(new View.OnClickListener()){
@凌驾
公共void onClick(视图v){
startActivity(新的Intent(Intent.ACTION_视图,Uri.parse(movie.getImdb_url()));
}
}); 
}
新建ImageLoader().execute(convertView.g,movie.getM_cover());
返回视图;
}
公共类ImageLoader扩展了异步任务{
私人视野;
私有位图=空;
@凌驾
受保护位图doInBackground(对象…参数){
//在这里获取传递的参数
视图=(视图)参数[0];
字符串uri=(字符串)参数[1];
//从此处传入的Uri创建位图
// ...
试一试{
URL req=新的URL(uri);
位图=BitmapFactory.decodeStream(req.openConnection()
.getInputStream());
}捕获(例外e){
//TODO:处理异常
}
返回位图;
}
@凌驾
受保护的void onPostExecute(位图){
if(位图!=null&&view!=null){
ImageView splash=(ImageView)view.findViewById(R.id.movie\u coming\u movie\u image\u view);
setImageBitmap(位图);
}
}
}
}

我认为问题在于,当列表项被重用时,您不会停止以前的
图像加载程序
:当列表项被重用时,另一个
图像加载程序
会附加到它,但不会删除附加到同一列表项实例的以前的图像加载程序

因此,第一个
ImageLoader
可能会在最后一个设置错误图像后完成其工作。您还需要缓存下载的图像,否则已下载的图像将再次下载


正确的做法(TM)应该是在与列表项相关的
holder
实例中设置图像位图,而不是停止加载程序,使其作用于
holder

这里发生的事情是加载图像并将其设置为用于