Listview如何定位到指定位置

来源:互联网 发布:e元素战隼z77宏编程 编辑:程序博客网 时间:2024/04/29 09:45

Listview如何定位到指定位置

可以通过ListView提供的lv.setSelection(48);方法。

如何在ScrollView中如何嵌入ListView

通常情况下我们不会在ScrollView中嵌套ListView,但是如果面试官非让我嵌套的话也是可以的。

在ScrollView添加一个ListView会导致listview控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。所以需要通过listview中的item数量去计算listview的显示高度,从而使其完整展示,如下提供一个方法供大家参考。

lv = (ListView) findViewById(R.id.lv);

      adapter = newMyAdapter();

      lv.setAdapter(adapter);

      setListViewHeightBasedOnChildren(lv);

----------------------------------------------------

public voidsetListViewHeightBasedOnChildren(ListView listView) {

      ListAdapter listAdapter = listView.getAdapter();

      if (listAdapter ==null) {

         return;

      }

      int totalHeight = 0;

      for (int i = 0; i < listAdapter.getCount();i++) {

         View listItem = listAdapter.getView(i, null,listView);

         listItem.measure(0, 0);

         totalHeight +=listItem.getMeasuredHeight();

}

      ViewGroup.LayoutParams params =listView.getLayoutParams();

      params.height =totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

      params.height += 5;// ifwithout this statement,the listview will be a

                      //little short 

      listView.setLayoutParams(params);

   }

ListView中如何优化图片

图片的优化策略比较多。

1、处理图片的方式:

如果ListView中自定义的Item中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是ListView项中最头疼的,处理图片的方法大致有以下几种:

①、不要直接拿路径就去循环BitmapFactory.decodeFile;使用Options保存图片大小、不要加载图片到内存去。

②、对图片一定要经过边界压缩尤其是比较大的图片,如果你的图片是后台服务器处理好的那就不需要了

③、在ListView中取图片时也不要直接拿个路径去取图片,而是以WeakReference(使用WeakReference代替强引用。比如可以使用WeakReference mContextRef)、SoftReference、WeakHashMap等的来存储图片信息。

④、在getView中做图片转换时,产生的中间变量一定及时释放

2、异步加载图片基本思想:

1)、 先从内存缓存中获取图片显示(内存缓冲)

2)、获取不到的话从SD卡里获取(SD卡缓冲)

3)、都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

原理:

优化一:先从内存中加载,没有则开启线程从SD卡或网络中获取,这里注意从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅。

优化二:于此同时,在adapter里有个busy变量,表示listview是否处于滑动状态,如果是滑动状态则仅从内存中获取图片,没有的话无需再开启线程去外存或网络获取图片。

优化三:ImageLoader里的线程使用了线程池,从而避免了过多线程频繁创建和销毁,如果每次总是new一个线程去执行这是非常不可取的,好一点的用的AsyncTask类,其实内部也是用到了线程池。在从网络获取图片时,先是将其保存到sd卡,然后再加载到内存,这么做的好处是在加载到内存时可以做个压缩处理,以减少图片所占内存。

ListView中图片错位的问题是如何产生的

图片错位问题的本质源于我们的listview使用了缓存convertView,假设一种场景,一个listview一屏显示九个item,那么在拉出第十个item的时候,事实上该item是重复使用了第一个item,也就是说在第一个item从网络中下载图片并最终要显示的时候,其实该item已经不在当前显示区域内了,此时显示的后果将可能在第十个item上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。

0 0
原创粉丝点击