(转载)listivew总结

一、改变选中时的底色(无色)

在ListView中设置Selector为null会报空指针?
mListView.setSelector(null);//空指针
试试下面这种:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
二、如何让ListView初始化的时候就选中一项?
ListView 需要在初始化好数据后,其中一项需要呈选中状态。所谓"选中状态"就是该项底色与其它项不同,setSelection(position)只能定位到某 个item,但是无法改变底色呈高亮。setSelection(position)只能让某个item显示在可见Item的最上面(如果Item超过一 屏的话)! 就是所谓的firstVisibleItem啦!
如果想要实现效果可以在listview所绑定的adapter里的getView函数里去完成一些具体的工作。可以记下你要高亮的那个item的index,在getView函数里判断index(也就是position),如果满足条件则加载不同的背景。
三、ListView的右边滚动滑块启用方法?
    很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,其实辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。
    还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,该方法是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。
四、 更新ListView中的数据

通過調用BaseAdapter對象的notifyDataSetChanged()方法:mAdapter.notifyDataSetChanged();

五、无效位置是常量:ListView.INVALID_POSITION
每個listview都有無效的位置,如第一行的前一行,最後一行的後一行,這個無效的位置是一個常量.
     ListView.INVALID_POSITION

六、如何用代码选择ListView项
有時我們需要在程序中通過點擊按鈕來控制ListView行的選中,這就用到了在程序中如何使用代碼來選擇ListView項.
         mListView.requestFocusFromTouch();
         mListView.setSelection(int index);
     第一條語句並不是必須的,但是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得焦點優先級高的控件時,那麼第一條語句是你必須加的.

七、出现优先级高的控件的处理方法
同樣的,若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得焦點優先級高的控件時,ListView的setOnItemClickListener是不被執行的,這時你需要在你的xml文件中對這些控件添加  android:focusable="false" 注意這條語句要放在xml文件中修改,在代碼中使用是無效的.

八、一直显示滚动条
如何保持ListView的滾動條一直顯示,不隱藏呢:  xml文件中做如下修改    android:fadeScrollbars="false"

九、控制按键事件
ListView本身有自己的按鍵事件,即你不需要設置方向鍵的標識,按下方向鍵ListView就會有默認的動作,那如何進行控制,編寫自己的onKey呢,你需要在Activity中重寫dispatchKeyEvent(KeyEvent event);方法,在這裡面定義你自己的動作就可以了
十、ListView 自定义滚动条样式:

  1. <ListView android:id="@android:id/list"
  2.         android:layout_width="match_parent"
  3.         android:layout_height="0dip"
  4.         android:layout_weight="1"
  5.         android:stackFromBottom="true"//从下开始显示条目
  6.         android:transcriptMode="normal"
  7.         android:fastScrollEnabled="true"
  8.         android:focusable="true"
  9.         android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
  10.         android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
  11. />
  12. //scrollbar_vertical_track,crollbar_vertical_thumb自定义的xml文件,放在Drawable中,track是指长条,thumb是指短条

十一、去掉ListView Selector选种时黄色底纹一闪的效果:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  3. <solid android:color="@android:color/transparent"/>
  4. <corners android:radius="0dip" />
  5. </shape>
  6. //listview.setSelector(R.drawable.thisShape);
  7. <?xml version="1.0" encoding="utf-8"?>
  8. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  9.     <solid android:color="@android:color/transparent"/>
  10.     <corners android:radius="0dip" />   
  11. </shape>
  12. //listview.setSelector(R.drawable.thisShape);
 
或者还有一种办法:
Java代码
  1. public boolean isEnabled(int position) {   
  2. // TODO Auto-generated method stub
  3. return false;   
  4. }
  5. public boolean isEnabled(int position) {
  6.         // TODO Auto-generated method stub
  7.         return false;
  8. }
十二、ListView几个比较特别的属性
1、stackFromBottom属性,设置该属性之后你做好的列表就会显示你列表的最下面,值为true和false      android:stackFromBottom="true"            
2、transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode="alwaysScroll"   
3、cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景很简单,只需要准备一张图片然后指定属性 android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。
如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
4、divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线android:divider="@drawable/list_driver"  其中  @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了
设置Item之间无间隙android:divider="#00000000" 或者在javaCode中如下定义:listView.setDividerHeight(0);
5、fadingEdge属性,上边和下边有黑色的阴影android:fadingEdge="none" 设置后没有阴影了~
6、scrollbars属性,作用是隐藏listView的滚动条,android:scrollbars="none"与setVerticalScrollBarEnabled(true)的效果是一样的,不活动的时候隐藏,活动的时候也隐藏
7、fadeScrollbars属性,android:fadeScrollbars="true"  配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。
8、drawSelectorOnTop

android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的

十三、如何在使用gallery在flinging拖动时候不出现选择的情况?
这时候需要注意使用
gallery.setCallbackDuringFling(false)
十四、如何让ListView自动滚动?
注意stackFromBottom以及transcriptMode这两个属性。类似Market客户端的低端不断滚动。
<ListView android:id="listCWJ"  
     android:layout_width="fill_parent"  
     android:layout_height="fill_parent"  
     android:stackFromBottom="true"   
     android:transcriptMode="alwaysScroll"  
/>
十五、如何遍历listView 的的单选框?
ListView listView = (ListView)findViewById(R.id.配置文件中ListView的ID);   
  • //全选遍历ListView的选项,每个选项就相当于布局配置文件中的RelativeLayout
  • for(int i = 0; i < listView.getChildCount(); i++){
  •       View view = listView.getChildAt(i);
  •       CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);
  •       cb.setChecked(true);
  • }

十六、如何让ListView中TextView的字体颜色跟随焦点变化?
我们通常需要ListView中某一项选中时,他的字体颜色和原来的不一样。如何设置字体的颜色呢?在布局文件中TextColor一项来设置颜色,但是不是只设置一种颜色,而是在不同的条件下设置不同的颜色:下面是个例子:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:state_enabled="false" android:color="@color/orange"></item>
  4. <item android:state_window_focused="false" android:color="@color/orange"></item>
  5. <item android:state_pressed="true" android:color="@color/white"></item>
  6. <item android:state_selected="true" android:color="@color/white"></item>
  7. <item android:color="@color/orange"></item>
  8. </selector>

在获取焦点或者选中的情况下设置为白色,其他情况设置为橘黄色。

十七、如何自定义ListView行间的分割线?
所有基于ListView或者说AbsListView实现的widget控件均可以通过下面的方法设置行间距的分割线,分割线可以自定义颜色、或图片。
在ListView中我们使用属性android:divider="#FF0000" 定义分隔符为红色,当然这里值可以指向一个drawable图片对象,如果使用了图片可能高度大于系统默认的像素,可以自己设置高度比如6个像素android:dividerHeight="6px" ,当然在Java中ListView也有相关方法可以设置。

十八、更新制定的item
ListView 不通过notifyDataSetChanged()更新指定的Item,Listview一般大都是通过notifyDataSetChanged() 來更新listview,但通过notifyDataSetChanged()会把界面上现实的的item都重绘一次,这样会影响ui性能。
可以通过更新指定的Item提高效率,伪代码如下:

  1. private void updateView(int itemIndex){     
  2. int visiblePosition = yourListView.getFirstVisiblePosition();     
  3.   View v = yourListView.getChildAt(itemIndex - visiblePosition);//Do something fancy with your listitem view  
  4.   TextView tv = (TextView)v.findViewById(R.id.sometextview);   
  5.   tv.setText("Hi! I updated you manually");   
  6. }

十九、让ListView中长按某些Item时能弹出contextMenu,有些不能
定义了一个listView,并为他设置了setOnCreateContextMenuListener的监听,但这样做只能使这个listView中的所有项在长按的时候弹出contextMenu 。
有时希望的是有些长按时能弹出contextMenu,有些不能。解决这个问题的办法是为这个listView设置setOnItemLongClickListener监听,然后实现

  1. public boolean onItemLongClick(AdapterView<?> parent, View view,   
  2. int position, long id) {   
  3. if(id == 1){   
  4. return true;   
  5.   }   
  6. return false;   
  7. }  

如果这一项的id=1,就不能长按。这样就可以了

 

二十、listview分割线原理:

在工作中遇到了一个难题,就是一个listView在最下面的一个item下面没有分割线,要求是必须得有这条分割线。经过一通研究发现了这个奇怪的现象:
      1. ListActivity有这条底部分割线。
      2.在Activity中只有listview,没有别的控件的话也会有。
      其实ListActivity也是一个Activity,只不过在其中使用了SetContentView(listView)方法设置了一个 listView作为其显示的View而已。所以结论就是只要这个activity调用了SetContentView(listView)就会有这条底 部分割线。
      那么什么情况下才不会有这条分割线呢?在Activity中如果调用setContentView(View)而ListView只是内嵌入到这个View的话有可能会没有这条分割线。
      分析其原因:通过加断点调试发现在listView中,所有的分割线都是通过画一个很窄的矩形来实现的,但是在画分割线前都会都会判断目前的位置A和 listView的长度B,如果A=B了,那么就不会画这条分割线了。但是将Listview嵌入到一个View中,一般会设置为高度为 wrap_content,这种情况下,最后那条分割线的位置刚好等于listView的高度,所以系统不会画上这条分割线。那要怎么样才会画上呢?很简 单,将ListView的高度设置为fill_partent就可以了。
     当然以上所说的都是item很少的情况下,如果item很多以至于必须显示滚动条的话,那最后一个item下面是肯定不会有分割线了。
二十一、
改变ListView拖动有黑影的方法:
1.    代码中:listView.setCacheColorHint(0);
2.    XML布局文件中:android:cacheColorHint="#00000000"



二十二、ListView用法总结

 

二十三、Android笔记-ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

Why ListView?

ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任。ListView存在的最根本的原因在于它的高效(如何实现的?).ListView 通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。 ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListView会按照需求,根据 Adapter提供的信息把需要的Item画出来显示在屏幕上,当屏幕滚动的时候会重新计算Item的位置并绘制出新的bitmap显示在屏幕上。这样听 起来感觉可能不是很高效,但这样带的好处就是,每用为一第个Item 创建一个View对象,样式一样的对象可以共用一个View对象,减少了内存的消耗。而且ListView是事件驱动的,只有当需要的时候才会重新绘制,并且只会 绘制当前屏幕上所显示的Items.

How To Use?

ListView 离不开Adapter,通常的作法创建一个类继承BaseAdapter,Override getCount()和getView()等方法。生成这个类的对象,调用ListView的setAdapter()与ListViw进行绑定。

How Does It work?

ListView会调用跟其绑定的Adapter的getCount()方法知道有多少个Item需要展示,然后循环调用getView(int position, View convertView, ViewGroup parent)知道第position个Item该怎么画,并画出来直到把当前的ListView的空间填满。当Adapter当中的数据改变时,需调用notifyDataSetChanged ()告诉Adapter数据发生了变化或者给Adapter注册一个观察者registerDataSetObserver (DataSetObserver observer)。当Adapter得知与其绑定的数据己发生改变时间,会再次调用getCount()方法,并循环调用getView(int position, View convertView, ViewGroup parent)刷新当前页面。

listview

Item 1

Item 2

Item 3

Item 4

Item 5

Item 6

Item 7

Item 8

当这个ListView 向上滚动需要创建一个Item9 同时,有些对象(比如Item1 )不在显示区域将看不到,这时android 将会把item1 的 引用传递给 Adapter.getView() 中的convertView这样我们就不用再创建一个View来存放Item9,只需要把原来的item1对象作下修改,就可以重复使用了 ;我们也不用担心convertView 是不是正确的类型,这个由系统保证,所以我们要作的就是把convertView 转换(经常需要向下转型)成我们自己的View 再给它赋值,in this case :(TextView) convertView.setText(“Item9”);

复制代码
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
//this would be first time to show the item,so we need to create it
convertView = mInflater.inflate(R.layout.item, null);
}
//we grab the convertView,modify it and reuse it
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
return convertView;
}
复制代码

调用方法所需要的消耗要比访问变量高得多,而上面的代码一次又一次的调用findViewById()方法,作着重复的事情。所以我们可以进一步进行如下优化: 创建一个类用来保存一些View的引用,这样我们就可以直接使用,而不用再调用findViewById().因为我们所保存的只是引用不是对象本身,所以不用担心会占用大量内存

复制代码
static class ViewHolder {
TextView text;
ImageView icon;
}

public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//we store the reference ,so that we don’t have to call findViewById() over and over again
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
复制代码
listview

上图是T-mobile g1上采集的的数据,现在看来可能现在不是很准确,但其性能上的差异还是很有参考价值的。

Tips & Tricks

ListView是为了大容量数据展示而设计的。如果数据量(Item的数量)不是很大,且用ListView实现起来比较麻烦,不妨换种思路,不使用ListView,而用ScrollView来实现。

如果Item信息布局比较复杂或者Item的数量很多,出于性能的考虑,建议自定义一个View组件实现需要的功能,而不是组合其它控件达到所要的效果。

ListView滚动变黑:在xml中给ListView增加一个属性android:cacheColorHint="#00000000" 。当ListVIew中有很多Item,有时候需要快速的滚动。比如从第一个Item滚动到第600个Item这个时候,中间的很多Item对用户来说意 义不是很大,但android却要调用 adapter.getView()方法将这些Item逐一画出,并且因为滚动很快用户不希望有任何的延迟。这在一些低端手机比如g1,是很难作到的。所 以google工程师想出的一个办法是在滚动的时候,让屏幕变黑用一张黑色bitmap盖住ListView,而不去绘制中间过程中的很多Item,从而 提升性能。

Item有自己的背景盖住了Selector光标:在xml中给ListView增加一个属性:android:drawSelectorOnTop="true"这样光标就会跑到Item上面的图层,解决我们的问题。

Snippets

多选框ListView

listview  listview 

带有进度条的ListView,多个子线程刷新各自的进度,如果子线程很多那么刷新就会变得很频繁,我们可以由一个handler负责统一刷新,这样我们就要以增加一些额外条件限制刷新的次数和条件

listview

分批加载的原理很简单,给ListView添加一个OnScrollListener监听滚动事件,当用户滚动到屏幕到特定的位置时加载新数据,并给LIstView加一个正在加载的footerView,当加载数据结束时再把这个footerView去掉。

listview

转载自:http://blog.sina.com.cn/s/blog_b37dcd9701018ozo.html

 

 /** listview更新指定item,下面只更新可见的内容,不可见的部分通过adapter的getview方法到可见时完成(更新底层数据即可) */
    private void updateListViewItem(int itemIndex, boolean isSelectedItem) {
        int firstVisiblePosition = slidingDrawerThumbnailContent.getFirstVisiblePosition();
        int lastVisiblePosition = slidingDrawerThumbnailContent.getLastVisiblePosition();
        if (itemIndex >= firstVisiblePosition && itemIndex <= lastVisiblePosition) {
            View view = slidingDrawerThumbnailContent.getChildAt(itemIndex - firstVisiblePosition);
            Holder holder = (Holder) view.getTag();
            if (isSelectedItem) {
                holder.thumbnailPic.setBackgroundDrawable(getResources().getDrawable(
                        R.drawable.red_rect_shape));
                holder.pageNumText.setBackgroundColor(getResources().getColor(R.color.red_f00));
            } else {
                holder.thumbnailPic.setBackgroundDrawable(getResources().getDrawable(
                        R.drawable.black_rect_shape));
                holder.pageNumText.setBackgroundColor(getResources().getColor(R.color.gray_666666));
            }
        }

    }

posted @ 2014-08-15 10:23  蓝色漩涡  阅读(142)  评论(0)    收藏  举报