【问题标题】:Listview shows images in wrong positions when scrolling滚动时 Listview 将图像显示在错误的位置
【发布时间】:2014-10-18 16:55:02
【问题描述】:

我有一个从服务器填写的 ListView。一切正常,但唯一的问题是滚动时下载的图像显示在错误的项目位置。只有几秒钟后,它才会在正确的位置显示正确的图像。

这是我的 ArrayAdapter 类,其中包括 AsynchTask:

public class ApplicationAdapter extends ArrayAdapter<Application> {
    private List<Application> items;

    public ApplicationAdapter(Context context, List<Application> items) {
        super(context, R.layout.app_custom_list, items);
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater li = LayoutInflater.from(getContext());
            v = li.inflate(R.layout.app_custom_list, null);
        }

        Application app = items.get(position);

        if (app != null) {
            ImageView imageView = (ImageView) v.findViewById(R.id.appIcon);
            TextView titleText  = (TextView) v.findViewById(R.id.titleTxt);

            if (imageView != null) {

                String path_image = app.getImagePath();

                // Call AsynchTask to load image into ImageView from path
                DownloadImageTask1 d = new DownloadImageTask(imageView);
                d.execute(path_image);
            }


            if (titleText != null) {

                titleText.setText(app.getTitle());

            }

        }

        return v;
    }

private class DownloadImageTask1 extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask1(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(getRoundedCornerBitmap(result));

    }
}

有人可以指导我正确的方向吗?我已经工作了好几天来解决这个问题。谢谢!!!

【问题讨论】:

    标签: android image listview android-asynctask


    【解决方案1】:

    这是因为ImageView 在滚动listview 时被重复使用。在listview onPreExecute 中显示加载图像。如果您为此使用像picasso 这样的库会更好。因为它会为您完成所有工作,包括将图像保存在 catch 中

    【讨论】:

    • 非常感谢。我现在正在使用毕加索,效果很棒!
    【解决方案2】:

    您应该使用另一个类来保存您的对象,它可以帮助您在设置后保持良好的参考。

    最好稍微改变一下适配器。

    最好一次获得对 layoutInflater 的引用,因为列表视图中的每个项目都会调用 getView。

    所以为整个班级声明你的 layoutInflater 并且只获得一次引用

    例如:

     private LayoutInflater inflater;
    
    
     @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageHolder holder = new ImageHolder();
    
            if (inflater == null)
                inflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
            if(convertView == null){
                convertView = inflater.inflate(R.layout.fragment_list_item_transition, null);
                ImageView imageView = (ImageView) convertView.findViewById(R.id.appIcon);
                TextView titleText  = (TextView) convertView.findViewById(R.id.titleTxt);
                holder.image = imageView;
                holder.title = titleText;
                convertView.setTag(holder); 
    
            }else{
                holder = (ImageHolder) convertView.getTag(position);
            }
    
            Application app = items.get(position);
    
            if (app != null) {
    
    
                holder.title.seText(app.getTitle());
                String path_image = app.getImagePath();
    
                // Call AsynchTask to load image into ImageView from path
                DownloadImageTask1 d = new DownloadImageTask1(holder.imageView);
    
                d.execute(path_image);
            }
    
            return convertView;
        }
    
    
        private static class ImageHolder{
            ImageView image;
            TextView title;
    
        }
    

    【讨论】:

      【解决方案3】:

      你也可以试试UniversalImageLoader库来加载图片。试试这个

      ImageLoader.getInstance().displayImage(url, holder.imgView, options);
      

      在适配器内加载图像..

      在适配器的构造函数中如下使用DisplayImageOptions

       options = new DisplayImageOptions.Builder()
                      .showImageOnLoading(android.R.color.transparent)
                      .showImageForEmptyUri(android.R.color.transparent)
                      .showImageOnFail(android.R.color.transparent)
                      .cacheInMemory(true)
                      .cacheOnDisk(true)
                      .considerExifParams(true)
                      .bitmapConfig(Bitmap.Config.RGB_565)
                      .build();
      

      并添加

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
              StrictMode.setThreadPolicy(policy);
      

      在包含列表的片段/活动的 onCreateView/onCreate 内

      【讨论】:

      • 毕加索和universalimageloader lib有很大区别吗?
      • @Sini 差别不大..UniversalImageLoader 具有高度可定制性,并且在文档方面更好,并提供了加载位图或图像的灵活方式.....要了解详细差异,请查看此链接..@ 987654322@.. 如果你觉得有用的话,你可以给我一个答案。谢谢..
      【解决方案4】:

      试试这样的...

      replace
      
       if (v == null) {
                  LayoutInflater li = LayoutInflater.from(getContext());
                  v = li.inflate(R.layout.app_custom_list, null);
              }
      
      with
      
      if (v == null) {
                  LayoutInflater li = LayoutInflater.from(getContext());
                  v = li.inflate(R.layout.app_custom_list, null);
                  convertView.setTag(v);
              } else {
                  v = (View) convertView.getTag();
              }
      

      【讨论】:

        猜你喜欢
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        相关资源
        最近更新 更多