我想在滚动时在列表视图中添加 500 张图像,并删除当前不在屏幕上的项目

Posted

技术标签:

【中文标题】我想在滚动时在列表视图中添加 500 张图像,并删除当前不在屏幕上的项目【英文标题】:I want to add 500 images in listview on scrolling, and remove items which are not on the screen currently 【发布时间】:2014-10-27 20:58:44 【问题描述】:

这是我在任何论坛上的第一篇文章,因此对于任何不正确的格式深表歉意。 我正在使用此自定义适配器在 listView 中获取图像并立即加载这些图像,但我想逐个滚动加载这些图像并删除滚动后屏幕上不再可用的前一个图像。提前感谢您提供任何相关的解决方案。

class MyAdapter extends BaseAdapter 
    private Context context;
    private int images[];
public MyAdapter(Context context, int images[]) 
    this.context = context;
    this.images = images;


@Override
public int getCount() 
    // TODO Auto-generated method stub
    return images.length;


@Override
public Object getItem(int position) 
    // TODO Auto-generated method stub
    return images[position];


@Override
public long getItemId(int position) 
    // TODO Auto-generated method stub
    return position;


class MyViewHolder 
    ImageView imageView;

    public MyViewHolder(View v) 
        // TODO Auto-generated constructor stub
        imageView = (ImageView) v.findViewById(R.id.imgView);
    


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    // TODO Auto-generated method stub
    View row = convertView;
    MyViewHolder holder = null;
    if (row == null) 
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.custom_list, parent, false);
        holder = new MyViewHolder(row);
        row.setTag(holder);
     else 
        holder = (MyViewHolder) row.getTag();
    
    holder.imageView.setImageResource(images[position]);

    return row;

这是我的 MainActivity,我正在调用 MyAdapter 来获取图像列表,目前我正在调用 MyAdapter 来获取 50 个图像的列表视图,但我很快就会调用它来获取 500 个图像。

private ListView listView;
private MyAdapter myAdapter;

 int[] images =  R.drawable.img001, R.drawable.img002, R.drawable.img003,
 R.drawable.img004, R.drawable.img005, R.drawable.img006,
 R.drawable.img007, R.drawable.img008, R.drawable.img009,
 R.drawable.img010, R.drawable.img011, R.drawable.img012,
 R.drawable.img013, R.drawable.img014, R.drawable.img015,
 R.drawable.img016, R.drawable.img017, R.drawable.img018,
 R.drawable.img019, R.drawable.img020, R.drawable.img021,
 R.drawable.img022, R.drawable.img023, R.drawable.img024,
 R.drawable.img025, R.drawable.img026, R.drawable.img027,
 R.drawable.img028, R.drawable.img029, R.drawable.img030,
 R.drawable.img031, R.drawable.img032, R.drawable.img033,
 R.drawable.img034, R.drawable.img035, R.drawable.img036,
 R.drawable.img037, R.drawable.img038, R.drawable.img039,
 R.drawable.img040, R.drawable.img041, R.drawable.img042,
 R.drawable.img043, R.drawable.img044, R.drawable.img045,
 R.drawable.img046, R.drawable.img047, R.drawable.img048,
 R.drawable.img049, R.drawable.img050 ;

protected void onCreate(Bundle savedInstanceState) 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                        myAdapter = new MyAdapter(this, images);
                listView = (ListView) findViewById(R.id.imgList);
                listView.setAdapter(myAdapter);
            

【问题讨论】:

在 ScrollListner 上使用 请参阅 ***.com/questions/13761639/… 【参考方案1】:

如果您使用资源中的图像,请尝试将它们的大小减小到 400kb 以下甚至更低,并采用 png 格式。图像大小在整个渲染过程中起着重要作用,并将其设置到 Imageview 中。如果图像的大小很大,那么它将在滚动时加载,应用程序将运行缓慢。删除未使用的 ListView 单元格(图像)将仅由适配器负责。您不必为此烦恼。

【讨论】:

目前我使用的是 jpg 格式的图片。使用 png 格式的图像会有什么不同吗?并且任何图像的大小不大于 280kb。 会的。尝试使用 png 格式。如果它甚至无法让您的应用程序窒息,那么将务实地减小大小。 如果我在列表视图中加载较小的图像并在滚动停止时在 onScrollListener 的 onScrollStateChanged 方法中替换图像怎么办。我怎样才能做到这一点?在 onScrollStateChanged 方法中写什么? @Naveen Tamrakar 你能帮忙吗? 我没有清楚地了解您的要求。您想将适配器的功能转移到 OnScrollStateChanged 方法吗?适配器有很多你无法通过在 OnScrollStateChanged 上更改图像来实现的功能。就像您无法获得用户正在点击的确切对象一样。所以这确实是一个非常糟糕的主意。 我只想替换用户停止滚动时屏幕上的列表视图项中的图像。【参考方案2】:

您不应在适配器之外加载图像。而是使用每个图像的异步任务按需加载每个图像,并使用缓存,因此不应每次都加载图像。

查看此链接http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

【讨论】:

他似乎对列表中的图像使用了可绘制资源。【参考方案3】:

由于您使用自己的可绘制资源而不是从互联网下载图像,因此没有问题。 ListView 在创建视图时分配可绘制对象,GC 应该释放不再可见的图像。因为您只持有可绘制对象的 int 引用,所以在设置适配器时不会创建所有图像。

【讨论】:

是的,我正在使用可绘制资源,如果 GC 自己释放图像,那么为什么我的应用程序在增加可绘制资源数量后变得更慢。有什么想法吗? 对此我不知道,抱歉。

以上是关于我想在滚动时在列表视图中添加 500 张图像,并删除当前不在屏幕上的项目的主要内容,如果未能解决你的问题,请参考以下文章

滚动时在另一个片段视频视图中重叠一个片段的视频拇指

ios - 使 UIScrollView 平滑滚动

我想在滚动时显示这个列表视图

滚动列表视图垂直和水平相同的图像

滚动时在标题上添加平滑过渡

ScrollView 未使用 imageview 更新