【问题标题】:Repeated ImageView on ListViewListView 上的重复 ImageView
【发布时间】:2014-01-17 03:44:06
【问题描述】:

我的 ImageView 每 6 个项目在 ListView 上重复 这是我的 CustomAdapter 代码

public class NewsAdapter extends ArrayAdapter<NewsContainer> {

private Context context;
private NewsContainer[] newsContainer;

public NewsAdapter(Context context, int textViewResourceID, NewsContainer[] newsContainers) {
    super(context, textViewResourceID, newsContainers);
    this.newsContainer = newsContainers;
    this.context = context;
}

@Override
public long getItemId(int position){
    return position;
}

public View getView(int position, View view, ViewGroup parent){
    viewHolder holder = null;
    if(view == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.news_listview, null);

        holder = new viewHolder();
        holder.image = (ImageView) view.findViewById(R.id.thumbnail);
        holder.title = (TextView) view.findViewById(R.id.title);
        holder.created_date = (TextView) view.findViewById(R.id.created_date);
        holder.category = (TextView) view.findViewById(R.id.category);
        holder.post_count = (TextView) view.findViewById(R.id.post_count);
        view.setTag(holder);
    } else {
        holder = (viewHolder) view.getTag();
    }

    NewsContainer news = newsContainer[position];
    SimpleDateFormat format = new SimpleDateFormat("DD/MM/yyyy", Locale.US);
    if(news != null){
        String date = format.format(news.getCreatedDate());
        holder.title.setText(news.getTitle());
        holder.post_count.setText(String.valueOf(news.getPostCount()));
        holder.created_date.setText(date);
        holder.category.setText(Html.fromHtml(news.getCategory()));
        if(!news.getThumbnail().equals("empty")){
            new ImageDownloaderTask(holder.image).execute(news.getThumbnail());
        }    
    }

    return view;
}

static class viewHolder {
    ImageView image;
    TextView title;
    TextView created_date;
    TextView category;
    TextView post_count;
}

ImageDownloader 类

public class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {

private final WeakReference<ImageView> imageViewWeakReference;

public ImageDownloaderTask(ImageView imageView) {
    this.imageViewWeakReference = new WeakReference<ImageView>(imageView);
}

@Override
protected Bitmap doInBackground(String... params) {
    return downloadBitmap(params[0]);
}

@Override
protected void onPostExecute(Bitmap bitmap){
    if(isCancelled()){
        bitmap = null;
    }

    if(imageViewWeakReference != null){
        ImageView imageView = imageViewWeakReference.get();
        if(imageView != null){
            if(bitmap != null){
                imageView.setImageBitmap(bitmap);
            } else {
                imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.ic_loading_image));
            }
        }
    }
}

@TargetApi(Build.VERSION_CODES.FROYO)
static Bitmap downloadBitmap(String url) {
    final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
    final HttpGet getRequest = new HttpGet(url);
    try {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            Log.w("ImageDownloader", "Error " + statusCode
                    + " while retrieving bitmap from " + url);
            return null;
        }

        final HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = null;
            try {
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                entity.consumeContent();
            }
        }
    } catch (Exception e) {
        // Could provide a more explicit error message for IOException or
        // IllegalStateException
        getRequest.abort();
        Log.w("ImageDownloader", "Error while retrieving bitmap from " + url);
    } finally {
        if (client != null) {
            client.close();
        }
    }
    return null;
}

我曾尝试使用 ViewHolder 但 ImageView 不断重复,并发现 ListView 回收其视图以保持较低的内存占用。但我不明白如何解决这个问题。

【问题讨论】:

  • 在您的适配器中覆盖 getCount() 方法有帮助吗?在这里,您基本上返回 newsContainer.size();

标签: android listview android-listview android-imageview


【解决方案1】:
else {
    holder = (viewHolder) view.getTag();
}

这是你真正的问题,如果view 为空,你会膨胀,但如果它已经有值,则不做任何修改。当view 被回收时,它将包含一些值并且不会为空。因此,您必须更改所有值,而不是重复使用现有值。

【讨论】:

  • 非常感谢,这正是我想要的。我解决了这个问题,将句子转换器 holder.image 添加到默认值。
  • @danigonlinea 我面临完全相同的问题,你能分享你为此修复的代码行吗?谢谢
  • @k2ibegin 简单的逻辑将帮助您解决问题。当您开始滚动时,从一侧移出屏幕的视图在 getview 中作为参数返回,同时获取另一侧的视图。这是完全相同的视图,因此如果您不更改内容.. 它只会显示旧视图。使用支架更改内容。
  • @k2ibegin 只需使用此 holder.image_item.setImageDrawable(null); 重置“else”块中的图像并避免重复使用现有的。
  • @danigonlinea 抱歉回答迟了,我遇到了其他问题。我试过了,但现在它只是在任何地方删除我的图像,例如在我看到图像重复的地方,这些地方显示为空,导致我的实际图像也被粉饰了!有没有特定的方法来重置以前的图像持有者?但是,我想在重置持有者图像视图后,如果用户向上滚动,那么这些图像将不存在?
【解决方案2】:

如果getView 中的缩略图为空,则应清除或重置图像视图。

用我的手机写的,为简短而道歉。

编辑:我没有看到你在你的代码中设置了这个。例如,您在哪里:

if(news != null){
    String date = format.format(news.getCreatedDate());
    holder.title.setText(news.getTitle());
    holder.post_count.setText(String.valueOf(news.getPostCount()));
    holder.created_date.setText(date);
    holder.category.setText(Html.fromHtml(news.getCategory()));
    if(!news.getThumbnail().equals("empty")){
        new ImageDownloaderTask(holder.image).execute(news.getThumbnail());
    }    
}

如果news 为空或news.getThumbnail().equals("empty") == true 怎么办?您将保持回收的图像视图不变。

【讨论】:

  • 我有设置代码在图像为空时添加默认图像,但仍然得到相同的结果
  • @Randy 我仍然没有看到您总是在清除旧图像。查看我的编辑。
【解决方案3】:
public View getView(int position, View view, ViewGroup parent){

 if(view == null){
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      view = inflater.inflate(R.layout.news_listview, null);
  }

    ImageView image = (ImageView) view.findViewById(R.id.thumbnail);
    TextView  title = (TextView) view.findViewById(R.id.title);
    TextView  created_date = (TextView) view.findViewById(R.id.created_date);
    TextView category = (TextView) view.findViewById(R.id.category);
    TextView post_count = (TextView) view.findViewById(R.id.post_count);

 NewsContainer news = NewsContainer[position];
 SimpleDateFormat format = new SimpleDateFormat("DD/MM/yyyy", Locale.US);
 if(news != null){
     String date = format.format(news.getCreatedDate());
     title.setText(news.getTitle());
     post_count.setText(String.valueOf(news.getPostCount()));
     created_date.setText(date);
     category.setText(Html.fromHtml(news.getCategory()));
     if(!news.getThumbnail().equals("empty")){
        new ImageDownloaderTask(image).execute(news.getThumbnail());
  }    

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多