Android – ListView – 按需调用getView()

我有一个ListView,它在每一行显示从互联网上提取的图像和一个字符串.

一般来说它工作正常.但是我希望控制视图(行)膨胀的方式.默认情况下,当行可见时,将调用适配器的getView()方法.

这当然不是最好的行为之一,因为如果我有一个包含数百条记录的ListView,并且我需要到达底部的那些,在滚动ListView时,将为每一行调用getView()方法,直到我到了页脚.

所以我想在滚动之后调用getView并且ListView处于暂停/空闲状态,但我不知道如何解决这个问题:

这是我开始的方式:

listView.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view,int scrollState) {
        if(scrollState==SCROLL_STATE_IDLE){
            // Invoke get view only on visible items
        }
    }

    @Override
    public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount) {

    }
});

这是我的适配器的getView:

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

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.row,parent,false);

        holder = new ViewHolder();
        holder.title = (TextView) convertView.findViewById(R.id.textView);
        holder.image = (ImageView) convertView.findViewById(R.id.imageView);
        holder.position = position;

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }


    holder.title.setText(data.get(position).getTitle());
    holder.image.setImageResource(R.drawable.ic_launcher);
    new LoadImageAsync(data.get(position).getUrl(),holder.image).execute();

    return convertView;
}

请给我一些指示,看看我应该在哪里实现这一点:只在滚动后调用getView(),并且仅针对可见项目.

解决方法

我最近读了一篇关于这个… here的文章.我没有尝试过,但它似乎是一个合理的理论.

基本上,他们主张添加一个布尔值,用于跟踪是否滚动,并将其用作适配器中的标志.如果布尔值为true(您正在滚动),则只在您的布局中绘制textviews.如果为false(您已停止滚动),则绘制所有内容.

通过使用notifyDataSetChanged(),您告诉适配器在不滚动时重绘可见视图.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...