ListView问题汇总
1.在ListView中设置Selector为null会报空指针?
mListView.setSelector(null);//空指针
试试下⾯这种:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
2.如何让ListView初始化的时候就选中⼀项?
ListView需要在初始化好数据后,其中⼀项需要呈选中状态。所谓"选中状态"就是该项底⾊与其它项不同,setSelection(position)只能定位到某个item,但是⽆法改变底⾊呈⾼亮。setSelection(position)只能让某个item显⽰在可见Item的最上⾯(如果Item超过⼀屏的话)! 就是所谓的firstVisibleItem啦!
如果想要实现效果可以在listview所绑定的adapter⾥的getView函数⾥去完成⼀些具体的⼯作。可以记下你要⾼亮的那个item的index,在getView函数⾥判断index(也就是position),如果满⾜条件则加载不同的背景。
3.ListView的右边滚动滑块启⽤⽅法?
很多开发者不知道ListView列表控件的快速滚动滑块是如何启⽤的,其实辅助滚动滑块只需要⼀⾏代码就可以搞定,如果你使⽤XML布局只需要在ListView节点中加⼊  android:fastScrollEnabled="true" 这个属性即可,⽽对于Java代码可以通过
myListView.setFastScrollEnabled(true); 来控制启⽤,参数false为隐藏。
还有⼀点就是当你的滚动内容较⼩,不到当前ListView的3个屏幕⾼度时则不会出现这个快速滚动滑块,该⽅法是AbsListView的基础⽅法,可以在ListView或GridView等⼦类中使⽤快速滚动辅助。
1. 更新ListView中的數據,通過調⽤BaseAdapter對象的notifyDataSetChanged()⽅法:
2. 每個listview都有無效的位置,如第⼀⾏的前⼀⾏,最後⼀⾏的後⼀⾏,這個無效的位置是⼀個常量.
ListView.INVALID_POSITION
3. 有時我們需要在程序中通過點擊按鈕來控制ListView⾏的選中,這就⽤到了在程序中如何使⽤代碼來選擇ListView項.
mListView.setSelection(int index);
第⼀語句並不是必須的,但是若你ListView項中含有Button,RadioButton,CheckBox等⽐ListView取得 焦點優先級⾼的控件時,那麼第⼀語句是你必須加的.
4.  同樣的,若你ListView項中含有Button,RadioButton,CheckBox等⽐ListView取得 焦點優先級⾼的控件時,ListView的setOnItemClickListener是不被執⾏的,這時你需要在你的xml⽂件中對這些控件添加  android:focusable="false" 注意這語句要放在xml⽂件中修改,在代碼中使⽤是無效的.
5. 如何保持ListView的滾動⼀直顯⽰,不隱藏呢:  xml⽂件中做如下修改    android:fadeScrollbars="false"
6. ListView本⾝有⾃⼰的按鍵事件,即你不需要設置⽅向鍵的標識,按下⽅向鍵ListView就會有默認的動作,那如何進⾏控制,編寫⾃⼰的onKey呢,你需要在Activity中重寫dispatchKeyEvent(KeyEvent event);⽅法,在這裡⾯定義你⾃⼰的動作就可以了
4.ListView ⾃定义滚动条样式:
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:stackFromBottom="true"//从下开始显⽰条⽬
android:transcriptMode="normal"
android:fastScrollEnabled="true"
android:focusable="true"
android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
/
>
//scrollbar_vertical_track,crollbar_vertical_thumb⾃定义的xml⽂件,放在Drawable中,track是指长条,thumb是指短条
5.去掉ListView Selector选种时黄⾊底纹⼀闪的效果:
Xml代码
1. <?xml version="1.0" encoding="utf-8"?>
2. <shape xmlns:android="schemas.android/apk/res/android">
3.    <solid android:color="@android:color/transparent"/>
4.    <corners android:radius="0dip" />
5. </shape>
6. //listview.setSelector(R.drawable.thisShape);
或者还有⼀种办法:
在Adapter中重写public boolean isEnabled(int position)⽅法,将其返回false就可以了,推荐采⽤此种办法,具体见
Java代码
1. public boolean isEnabled(int position) {
2.    // TODO Auto-generated method stub
3.    return false;
4. }
6.ListView⼏个⽐较特别的属性
⾸先是stackFromBottom属性,这只该属性之后你做好的列表就会显⽰你列表的最下⾯,值为true和false
android:stackFromBottom="true"
第⼆是transciptMode属性,需要⽤ListView或者其它显⽰⼤量Items的控件实时跟踪或者查看信息,并
且希望最新的条⽬可以⾃动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(⽀持ScrollBar)⾃动滑动到最底部。
android:transcriptMode="alwaysScroll"
第三cacheColorHint属性,很多⼈希望能够改变⼀下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备⼀张图⽚然后指定属性 android:background="@drawable/bg",不过不要⾼兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空⽩位置的时候发现ListItem都变成⿊⾊的了,破坏了整体效果。
如果你只是换背景的颜⾊的话,可以直接指定android:cacheColorHint为你所要的颜⾊,如果你是⽤图⽚做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
第四divider属性,该属性作⽤是每⼀项之间需要设置⼀个图⽚做为间隔,或是去掉item之间的分割线
android:divider="@drawable/list_driver"  其中  @drawable/list_driver 是⼀个图⽚资源,如果不想显⽰分割线则只要设置为android:divider="@drawable/@null" 就可以了
第五fadingEdge属性,上边和下边有⿊⾊的阴影android:fadingEdge="none" 设置后没有阴影了~
第五scrollbars属性,作⽤是隐藏listView的滚动条,android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是⼀样的,不活动的时候隐藏,活动的时候也隐藏
第六fadeScrollbars属性,android:fadeScrollbars="true"  配置ListView布局的时候,设置这个属性为true就可以实现滚动条的⾃动隐藏和显⽰。
7.如何在使⽤gallery在flinging拖动时候不出现选择的情况?
这时候需要注意使⽤
gallery.setCallbackDuringFling(false)
8.如何让ListView⾃动滚动?
注意stackFromBottom以及transcriptMode这两个属性。类似Market客户端的低端不断滚动。
<ListView android:id="listCWJ"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
/>
9.如何遍历listView 的的单选框?
Java代码
1. ListView listView = (ListView)findViewById(R.id.配置⽂件中ListView的ID);
2. //全选遍历ListView的选项,每个选项就相当于布局配置⽂件中的RelativeLayout
3. for(int i = 0; i < ChildCount(); i++){
4.      View view = ChildAt(i);
5.      CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);
6.      cb.setChecked(true);
7. }
10.如何让ListView中TextView的字体颜⾊跟随焦点的变化?
我们通常需要ListView中某⼀项选中时,他的字体颜⾊和原来的不⼀样。 如何设置字体的颜⾊呢? 在布局⽂件中TextColor⼀项来设置颜⾊,但是不是只设置⼀种颜⾊,⽽是在不同的条件下设置不同的颜⾊: 下⾯是个例⼦:
Xml代码
1. <?xml version="1.0" encoding="utf-8" ?>
2. <selector xmlns:android="schemas.android/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>
9. 在获取焦点或者选中的情况下设置为⽩⾊,其他情况设置为橘黄⾊。
11.如何⾃定义ListView⾏间的分割线?
所有基于ListView或者说AbsListView实现的widget控件均可以通过下⾯的⽅法设置⾏间距的分割线,分割线可以⾃定义颜⾊、或图⽚。 在ListView中我们使⽤属性android:divider="#FF0000" 定义分隔符为红⾊,当然这⾥值可以指向⼀个drawable图⽚对象,如果使⽤了图⽚可能⾼度⼤于系统默认的像素,可以⾃⼰设置⾼度⽐如6个像素android:dividerHeight="6px" ,当然在Java中ListView也有相关⽅法可
以设置。
12.ListView不通过notifyDataSetChanged()更新指定的Item
Listview⼀般⼤都是通过notifyDataSetChanged()來更新listview,但通过notifyDataSetChanged()会把界⾯上现实的的item都重绘⼀次,这样会影响ui性能。
可以通过更新指定的Item提⾼效率,伪代码如下:
Java代码
1. private void updateView(int itemIndex){
2.  int visiblePosition = FirstVisiblePosition();
3.  View v = ChildAt(itemIndex - visiblePosition);//Do something fancy with your listitem view
4.  TextView tv = (TextView)v.findViewById(R.id.sometextview);
gridview不显示5.  tv.setText("Hi! I updated you manually");
6. }
13.让ListView中长按某些Item时能弹出contextMenu,有些不能
定义了⼀个listView,并为他设置了setOnCreateContextMenuListener的监听,但这样做只能使这个listView中的所有项在长按的时候弹出contextMenu 。
有时希望的是有些长按时能弹出contextMenu,有些不能。解决这个问题的办法是为这个listView设置setOnItemLongClickListener监听,然后实现
Java代码
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,就不能长按。 这样就可以了
14.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下⾯是肯定不会有分割线了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。