当前位置:首页 » 安卓系统 » androidlistview优化

androidlistview优化

发布时间: 2022-11-25 18:52:18

㈠ 如何解决listview性能问题

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。

▲图4-35 BaseAdapter中的方法
使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法,看一下有哪些方法,如图4-35所示为继承自BaseAdapter的SpeechListAdapter所实现的方法,其中最重要的即为getView()方法。这些方法都有什么作用呢?我们通过分析ListView的原理来为读者解答。

当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()和getItemId()则在需要处理和取得Adapter中的数据时调用。那么getView如何使用呢?如果有10000行数据,就绘制10000次?这肯定会极大的消耗资源,导致ListView滑动非常的慢,那应该怎么做呢?通过一个例子来讲解如何在使用BaseAdapter的时候优化ListView的显示。例子中将上一节中的ImageView换成Button,并且处理Button的点击事件,其中对ListView的显示做了优化。

布局文件和上一例类同,读者可以在光盘的工程目录中查看,这里只给出Activity类。
001 publicclass MyListViewBase extends Activity {
002
003 private ListView lv;
004 //定义一个动态数组
005 ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */
006
007 @Override
008 publicvoid onCreate(Bundle savedInstanceState) {
009 super.onCreate(savedInstanceState);
010 setContentView(R.layout.main);
011
012 lv = (ListView) findViewById(R.id.lv);
013 MyAdapter mAdapter = new MyAdapter(this);//得到一个MyAdapter对象
014 lv.setAdapter(mAdapter);//为ListView绑定Adapter
015 /**为ListView添加点击事件*/
016 lv.setOnItemClickListener(new OnItemClickListener() {
017 @Override
018 publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,longarg3) {
019 Log.v("MyListViewBase", "你点击了ListView条目" + arg2);//在LogCat中输出信息
020 }
021 });
022 }
023 /**添加一个得到数据的方法,方便使用*/
024 private ArrayList<HashMap<String, Object>> getDate(){
025 ArrayList<HashMap<String, Object>> listItem = newArrayList<HashMap<String,Object>>();
026 /**为动态数组添加数据*/
027 for(inti=0;i<30;i++)
028 {
029 HashMap<String, Object> map = new HashMap<String, Object>();
030 map.put("ItemTitle","第"+i+"行");
031 map.put("ItemText", "这是第"+i+"行");
032 listItem.add(map);
033 }
034 return listItem;
035 }
036 /** 新建一个类继承BaseAdapter,实现视图与数据的绑定
037 */
038 privateclass MyAdapter extends BaseAdapter {
039 private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局
040
041 /**构造函数*/
042 public MyAdapter(Context context) {
043 this.mInflater = LayoutInflater.from(context);
044 }
045
046 @Override
047 publicint getCount() {
048 return getDate().size();//返回数组的长度
049 }
050
051 @Override
052 public Object getItem(int position) {
053 returnnull;
054 }
055
056 @Override
057 publiclong getItemId(int position) {
058 return 0;
059 }
060
061 /**书中详细解释该方法*/
062 @Override
063 public View getView(finalint position, View convertView, ViewGroup parent) {
064 ViewHolder holder;
065 //观察convertView随ListView滚动情况
066 Log.v("MyListViewBase", "getView " + position + " " + convertView);
067 if (convertView == null) {
068 convertView = mInflater.inflate(R.layout.item,null);
069 holder = new ViewHolder();
070 /**得到各个控件的对象*/
071 holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
072 holder.text = (TextView) convertView.findViewById(R.id.ItemText);
073 holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
074 convertView.setTag(holder);//绑定ViewHolder对象
075 }
076 else{
077 holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
078 }
079 /**设置TextView显示的内容,即我们存放在动态数组中的数据*/
080 holder.title.setText(getDate().get(position).get("ItemTitle").toString());
081 holder.text.setText(getDate().get(position).get("ItemText").toString());
082
083 /**为Button添加点击事件*/
084 holder.bt.setOnClickListener(new OnClickListener() {
085 @Override
086 publicvoid onClick(View v) {
087 Log.v("MyListViewBase", "你点击了按钮" + position);//打印Button的点击信息
088 }
089 });
090
091 return convertView;
092 }
093
094 }
095
096 /**存放控件*/
097 publicfinalclass ViewHolder{
098 public TextView title;
099 public TextView text;
100 public Button bt;
101 }
102 }
运行效果如图4-36所示。还需要注意的是,Button会抢夺ListView的焦点,需要将Button设置为没有焦点。设置非常简单,只需要在xml的Button标签下加入一行:android:focusable=“false”代码就可以了。

㈡ android listview 按照网上的优化方法提示 空指针访问:变量 convertView 在此位置只可为空值 就是else后

在getView 的方法中,需要每次判断 convertView 是否为空,应为有可能listview滑动过快,导致布局来不及释放重用。如果convertView为空,则按照正常的流程,convertView赋值,如convertView = findViewById(id);确保此值不为空。

㈢ android ListView 每个item加载大量的文本滑动会出现内存溢出咋办咋办

这个设计到listview优化问题。
首先,listview必须严格按照convertView及viewHolder格式书写,这样可以基本保证数据最优。
其次,如果自定义Item中有涉及到图片等等的,一定要做图片优化。bitmap释放可以不做。
第三,尽量避免在BaseAdapter中使用static 来定义全局静态变量,这个影响很大,static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(比如Context的情况最多),这时就要尽量避免使用了..
第四,尽量避免在ListView适配器中使用线程,因为线程产生内存泄露的主要原因在于线程生命周期的不可控制。
最后,如果上述你都做到的话,你的listview已经优化的很好了。针对你的问题,你的listview控件高度是否设置为fill_parent,因为warp会导致listview滑动中无限计算自身高度。你的文本加载是否做过线程以及多次重复加载的问题处理。你的item中变量是否多次无限生成新的内存对象等等。

㈣ listview的优化不正确的是

listview的优化不正确的是Item的布局层级越多越好。listview的优化分为两类,布局优化和数据优化,Item的布局层级越多,xml文件解析并显示到界面上,这是非常消耗资源的。

㈤ 针对Android的性能优化集中哪些方面

一、概要:

本文主要以Android的渲染机制、UI优化、多线程的处理、缓存处理、电量优化以及代码规范等几方面来简述Android的性能优化

二、渲染机制的优化:

大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。

*关于JobScheler的更多知识可以参考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html

七、代码规范

1)for loop中不要声明临时变量,不到万不得已不要在里面写try catch。

2)明白垃圾回收机制,避免频繁GC,内存泄漏,OOM(有机会专门说)

3)合理使用数据类型,StringBuilder代替String,少用枚举enum,少用父类声明(List,Map)

4)如果你有频繁的new线程,那最好通过线程池去execute它们,减少线程创建开销。

5)你要知道单例的好处,并正确的使用它。

6)多用常量,少用显式的"action_key",并维护一个常量类,别重复声明这些常量。

7)如果可以,至少要弄懂设计模式中的策略模式,组合模式,装饰模式,工厂模式,观察者模式,这些能帮助你合理的解耦,即使需求频繁变更,你也不用害怕牵一发而动全身。需求变更不可怕,可怕的是没有在写代码之前做合理的设计。

8)View中设置缓存属性.setDrawingCache为true.

9)cursor的使用。不过要注意管理好cursor,不要每次打开关闭cursor.因为打开关闭Cursor非常耗时。Cursor.require用于刷cursor.

10)采用SurfaceView在子线程刷新UI,避免手势的处理和绘制在同一UI线程(普通View都这样做)

11)采用JNI,将耗时间的处理放到c/c++层来处理

12)有些能用文件操作的,尽量采用文件操作,文件操作的速度比数据库的操作要快10倍左右

13)懒加载和缓存机制。访问网络的耗时操作启动一个新线程来做,而不要再UI线程来做

14)如果方法用不到成员变量,可以把方法申明为static,性能会提高到15%到20%

15)避免使用getter/setter存取field,可以把field申明为public,直接访问

16)私有内部类要访问外部类的field或方法时,其成员变量不要用private,因为在编译时会生成setter/getter,影响性能。可以把外部类的field或方法声明为包访问权限

17)合理利用浮点数,浮点数比整型慢两倍

18)针对ListView的性能优化,ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。ListView中getView是性能是关键,这里要尽可能的优化。

getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能

19)不用new关键词创建类的实例,用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。

clone()方法不会调用任何类构造函数。在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:

20)public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。

21)乘法和除法

考虑下面的代码:

  • for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
    用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:
    for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

  • 22)ViewPager同时缓存page数最好为最小值3,如果过多,那么第一次显示时,ViewPager所初始化的pager就会很多,这样pager累积渲染耗时就会增多,看起来就卡。

    23)每个pager应该只在显示时才加载网络或数据库(UserVisibleHint=true),最好不要预加载数据,以免造成浪费

    24)提高下载速度:要控制好同时下载的最大任务数,同时给InputStream再包一层缓冲流会更快(如BufferedInputStream)

    25)提供加载速度:让服务端提供不同分辨率的图片才是最好的解决方案。还有合理使用内存缓存,使用开源的框架

    引用:Android性能优化的浅谈

    ㈥ Recyclerview多种场景下的优化

    因为APP设计的原因,Recyclerview是我在Android中最常用的组件,我们公司的APP几乎每一个页面都会包含至少一个Recyclerview,本篇文章主要介绍一些我个人在工作中总结、收集的recyclerview优化经验。

    1.不要在onBindViewHolder中设置点击事件和耗时操作

    Recyclerview的onBindViewHoler主要负责将数据与holder绑定,它在列表滑动时会不停的被调用。如果在onBindViewHolder中设定监听操作,会导致已经的绑定点击事件的view,被重复绑定监听操作。

    点击事件的监听可以在onCreateViewHolder中设定。一些会创建新对象的操作,也需要根据实际情况考虑从onBindViewHolder中迁移到onCreateViewHolder。

    注意: onBindViewHolder运行在UI线程中,如果进行了耗时操作,会导致页面卡顿。并且onBindViewHolder中只应该进行数据的绑定,而不应该进行数据的处理和计算等操作。

    2.Recyclerview嵌套Recyclerview的优化

    Recyclerview嵌套Recyclerview最经典的运用就是,一个纵向滑动的列表内部的每个item是一个可以横向滑动的Recyclerview,比如说GooglePlay。

    这种情况可以使用LinearLayoutManager.setInitialPrefetchItemCount()设定
    横向列表初次显示时可见item的个数。如果横向滑动的View中数据量很少,并且不需要横向刷新时,也可以考虑使用HorizontalScrollView实现。

    关于这个API的官方文档翻译如下:

    如果将此值设置为大于此视图中可见的视图数可能会导致不必要的绑定工作,并且会增加创建和活动使用的视图数。

    3.多个RecycerView共用RecycledViewPool

    在大多数APP中都有这样一种场景,一个ViewPager中包含多个Fragment,而Fragment中主体是Recyclerview,并且Recyclerview中item view的布局是相同的。例如 微博等

    这种情况下,Recyclerview可以设定统一的缓存池用来提高性能。

    新建缓存池:

    设定缓存池:

    4.精确的更新数据使用DiffUtil

    在Recyclerview中提供了多种数据数据刷新方式

    虽然有了这些刷新方式,但是实际开发中,存在这样一种情况,新数据集与旧数据集仅有一部分数据存在差异。

    例如:刷新一个联系人列表,联系人列表中部分联系人的头像有变化,但是姓名和手机号码等信息未发生变化。这种情况以往都是使用notifyDataChanged方法刷新全部数据,但是刷新全部数据的会导致整个布局重绘,Recyclerview中针对这种情况还提供了另一种粒度更小的刷新方式 DiffUti

    这里不打算去讲DiffUtil的具体用法,只需要记住DiffUtil的使用场景即可: 列表中存在多个Item的数据需要刷新,但是新数据集与旧数据集存在重复的情况

    5.灵活设定setHasFixedSize
    在Recyclerview中使用以下方法时,会触发requestLayout()

    requestLayout()会重新计算item的大小,如果item的布局文件已经将宽高设为固定大小,可以设定setHasFixedSize(true),来避免Recyclerview重新计算item的大小。

    6.优化Item的布局
    布局优化是个老生长谈的问题,本质上就是减少嵌套,ConstraintLayout是google推出的一个用于减少布局嵌套的新layout,但是在Recyclerview中使用ConstraintLayout会导致cpu使用率上升,暂时不推荐使用,不过ConstraintLayout 2.0版本已经进入beta测试,期待后续会有优化。

    7.数据非常少时,使用ListView
    不知道你有没有考虑过这样的问题,RecyclerView用已经如此强大,用得人也越来越多,为什么最新的Android系统中ListView依然没有被标注为"过时"。
    RecyclerView重新设计了缓存机制,新的缓存机制更加强大,更适合处理大量数据的显示,但是这种缓存机制会占据更多的内存,当一个列表页面实际数据项非常少的时候,ListView往往比RecyclerView更合适。

    ㈦ 优化listview 有哪些方法

    ListView几乎在每个应用中都会用到。用ListView易于展现一些如联系人、菜单等tems信息。这好像可以理所当然地认为Android应该有现成封装好的方式来展现这类数据,最新的实现版就是RecyclerView。它被构建用于高效重复利用views,而不是每次当某个Viewitem进入屏幕时重新创建它。在RecyclerView之前,我们一般使用ListView,而且在今天ListView仍然被广泛使用。虽然ListView也回收views,但它却维持一个空间作为Android中一个最misconfigured的views。我们知道,这个话题在之前已经讨论了很多,但是我今天在这篇博客提及它,是因为在今天我们仍然有很多人在使用ListView时姿势不正确。下面是LisView的一个所谓标准写法的ArrayAdapter实现代码段。@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);ViewrowView=inflater.inflate(R.layout.view_test_row,parent,false);TextViewtestName=(TextView)rowView.findViewById(R.id.text_view_test_name);TextViewtestDesc=(TextView)rowView.findViewById(R.id.text_view_test_desc);//modifyTextViews,;}像这样写一个AdapterView,当你的list一次性显示在屏幕上时这种写法并没有什么问题,但是当拥有大量的items而且每个item的view都非常复杂的时候。这将引发性能问题,上面代码片段里面的方法非常耗性能。当用户滑动屏幕的时候,对于每个子view都要通过LayoutInflater类加装一遍,并且每次都会调用findViewById()来寻找组件。每次findViewById()被调用的时候,View各层次都会遍历一次直到找到对应的ID,对于每个子View都必须这样去找!如果用户滑动手速比较快的话,就可能出现明显的卡顿现象。为了解决这个问题,我们可以用一个static的类来关联我们之前未曾用到的convertView。staticclassViewHolder(){TextViewtestName;TextViewtestDesc;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewrowView=convertView;//.if(convertView==null){LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);rowView=inflater.inflate(R.layout.view_test_row,parent,false);ViewHolderviewHolder=newViewHolder();viewHolder.testName=(TextView)rowView.findViewById(R.id.text_view_test_name);viewHolder.testDesc=(TextView)rowView.findViewById(R.id.text_view_test_desc);rowView.setTag(viewHolder);}ViewHolderholder=(ViewHolder)rowView.getTag();//.testName.setText("Test"+position);holder.testDesc.setText("Thisisnumber"+position);returnrowView;}但是,convertView又是什么东东呢?它可以运行ListView跳过某行(row)为了显示内容而需要的一些设置,它是某个当前正退出屏幕的子view。我们可以复用这个子view来显示新的行(row)。当最初显示ListView的时候,一切都是正常初始化的。由于没有任何views可被复用,所以convertView是null。此时,view会被重新加载,但是TextViews组件被找到之后会被保存到一个ViewHolder对象中。我们可以通过调用setTag()和getTag()方法来将数据保存到view中,之后如果需要可以从中取出数据。这个改变看起来也许没什么大的区别,但是当我们的views更复杂、数量的时候,其效率差别就会非常明显了。我们开发者们,最想做的一件是可能就是做出一个拥有非常棒的用户体验感的项目。上IT蓝豹看用户体验源码

    ㈧ android中listview新能优化常用方法有哪些

    主要是优化getivew方法里的图片加载。
    另外:listview已经被淘汰了,google推出recyclerView替代它,具体用法可以搜索,鉴于你们提问题的几乎不怎么会找答案,我替你搜了个 http://www.cnblogs.com/tiantianbyconan/p/4232560.html

    ㈨ Android性能优化总结

    常用的Android性能优化方法:

    一、布局优化:

    1)尽量减少布局文件的层级。

    层级少了,绘制的工作量也就少了,性能自然提高。

    2)布局重用 <include标签>

    3)按需加载:使用ViewStub,它继承自View,一种轻量级控件,本身不参与任何的布局和绘制过程。他的layout参数里添加一个替换的布局文件,当它通过setVisibility或者inflate方法加载后,它就会被内部布局替换掉。

    二、绘制优化:

    基于onDraw会被调用多次,该方法内要避免两类操作:

    1)创建新的局部对象,导致大量垃圾对象的产生,从而导致频繁的gc,降低程序的执行效率。

    2)不要做耗时操作,抢CPU时间片,造成绘制很卡不流畅。

    三、内存泄漏优化:

    1)静态变量导致内存泄漏   比较明显

    2)单例模式导致的内存泄漏 单例无法被垃圾回收,它持有的任何对象的引用都会导致该对象不会被gc。

    3)属性动画导致内存泄漏  无限循环动画,在activity中播放,但是onDestroy时没有停止的话,动画会一直播放下去,view被动画持有,activity又被view持有,导致activity无法被回收。

    四、响应速度优化:

    1)避免在主线程做耗时操作 包括四大组件,因为四大组件都是运行在主线程的。

    2)把一些创建大量对象等的初始化工作放在页面回到前台之后,而不应该放到创建的时候。

    五、ListView的优化:

    1)使用convertView,走listView子View回收的一套:RecycleBin 机制

    主要是维护了两个数组,一个是mActiveViews,当前可见的view,一个是mScrapViews,当前不可见的view。当触摸ListView并向上滑动时,ListView上部的一些OnScreen的View位置上移,并移除了ListView的屏幕范围,此时这些OnScreen的View就变得不可见了,不可见的View叫做OffScreen的View,即这些View已经不在屏幕可见范围内了,也可以叫做ScrapView,Scrap表示废弃的意思,ScrapView的意思是这些OffScreen的View不再处于可以交互的Active状态了。ListView会把那些ScrapView(即OffScreen的View)删除,这样就不用绘制这些本来就不可见的View了,同时,ListView会把这些删除的ScrapView放入到RecycleBin中存起来,就像把暂时无用的资源放到回收站一样。

    当ListView的底部需要显示新的View的时候,会从RecycleBin中取出一个ScrapView,将其作为convertView参数传递给Adapter的getView方法,从而达到View复用的目的,这样就不必在Adapter的getView方法中执行LayoutInflater.inflate()方法了。

    RecycleBin中有两个重要的View数组,分别是mActiveViews和mScrapViews。这两个数组中所存储的View都是用来复用的,只不过mActiveViews中存储的是OnScreen的View,这些View很有可能被直接复用;而mScrapViews中存储的是OffScreen的View,这些View主要是用来间接复用的。

    2)使用ViewHolder避免重复地findViewById

    3)快速滑动不适合做大量异步任务,结合滑动监听,等滑动结束之后加载当前显示在屏幕范围的内容。

    4)getView中避免做耗时操作,主要针对图片:ImageLoader来处理(原理:三级缓存)

    5)对于一个列表,如果刷新数据只是某一个item的数据,可以使用局部刷新,在列表数据量比较大的情况下,节省不少性能开销。

    六、Bitmap优化:

    1)减少内存开支:图片过大,超过控件需要的大小的情况下,不要直接加载原图,而是对图片进行尺寸压缩,方式是BitmapFactroy.Options 采样,inSampleSize 转成需要的尺寸的图片。

    2)减少流量开销:对图片进行质量压缩,再上传服务器。图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但是中间的bitmap并没有被压缩。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);

    七、线程优化:

    使用线程池。为什么要用线程池?

    1、从“为每个任务分配一个线程”转换到“在线程池中执行任务”

    2、通过重用现有的线程而不是创建新线程,可以处理多个请求在创建销毁过程中产生的巨大开销

    3、当使用线程池时,在请求到来时间 ,不用等待系统重新创建新的线程,而是直接复用线程池中的线程,这样可以提高响应性。

    4、通过和适当调整线程池的大小 ,可以创建足够多的线程以使处理器能够保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或者失败。

    5、一个App里面所有的任务都放在线程池中执行后,可以统一管理 ,当应用退出时,可以把程序中所有的线程统一关闭,避免了内存和CPU的消耗。

    6、如果这个任务是一个循环调度任务,你则必须在这个界面onDetach方法把这个任务给cancel掉,如果是一个普通任务则可cancel,可不cancel,但是最好cancel

    7、整个APP的总开关会在应用退出的时间把整个线程池全部关闭。

    八、一些性能优化建议:

    1)避免创建过多对象,造成频繁的gc

    2)不要过多使用枚举,枚举占用的空间比整型大很多

    3)字符串的拼接使用StringBuffer、StringBuilder来替代直接使用String,因为使用String会创建多个String对象,参考第一条。

    4)适当使用软引用,(弱引用就不太推荐了)

    5)使用内存缓存和磁盘缓存。

    ㈩ 为什么我的listview背景是黑色的优化问题

    要使用android:cacheColorHint="@null" 和android:listSelector="@null" 是listview除去背景色,ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,原因是,滚动时,列表里面的view重绘时,用的依旧是系统默认的透明色,颜色值为#FF191919,要改变这种情况,只需要调用listView的setCacheColorHint(0),颜色值设置为0,或者xml文件中listView的属性Android:cacheColorHint="#00000000"即可,滚动时,重绘View的时候就不会有背景颜色。android:listSelector="#00000000"进行上面的设置之后,ListView点击item时就没有任何现象了,android:listSelector="@null"不可以实现。自定义listview的时候,当你不使用android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况,破坏整体美观度

    热点内容
    脚本精灵并且 发布:2024-05-20 11:39:40 浏览:266
    绿盟登陆器单机怎么配置列表 发布:2024-05-20 11:34:34 浏览:971
    Android省电软件 发布:2024-05-20 11:25:00 浏览:341
    android键盘隐藏 发布:2024-05-20 11:23:40 浏览:523
    疯狂点击的点击脚本 发布:2024-05-20 11:09:06 浏览:686
    饭团文件夹 发布:2024-05-20 10:56:18 浏览:575
    win10系统重置密码是多少 发布:2024-05-20 10:47:51 浏览:992
    java加包 发布:2024-05-20 10:39:12 浏览:713
    网吧里的电影怎么传服务器 发布:2024-05-20 10:31:12 浏览:809
    新年解压糖 发布:2024-05-20 09:50:55 浏览:55