首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ListView上重复ImageView

在ListView上重复ImageView
EN

Stack Overflow用户
提问于 2014-01-17 11:44:07
回答 3查看 1.4K关注 0票数 0

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

代码语言:javascript
运行
复制
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类

代码语言:javascript
运行
复制
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会回收它的视图,以保持较低的内存占用。但是我不明白如何解决这个问题。

EN

Stack Overflow用户

发布于 2014-01-17 15:21:56

代码语言:javascript
运行
复制
else {
    holder = (viewHolder) view.getTag();
}

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

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21177437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档