ListView的一些小细节

ListView的Item中含有Button时没法响应onItemClick()? 
解决办法就是将Button的Focus设置为非默认获取 

方法一:将ListView的Item Layout的子控件focusable属性设置为false 

方法二(推荐):对Item Layout的根控件android:descendantFocusability="blocksDescendant" 

方法三:在实现ListView的Adapter的getView方法时,将button.setFocusable(false); 


在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),若是知足条件则加载不一样的背景。 
或者: 
android

Java代码  ide

  1. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);  函数

  2. getListView().setItemChecked(position, true);  布局


ListView的右边滚动滑块启用方法? 
    不少开发者不知道ListView列表控件的快速滚动滑块是如何启用的,其实辅助滚动滑块只须要一行代码就能够搞定,若是你使用XML布局只须要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性便可,而对于Java代码能够经过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 
    还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,该方法是AbsListView的基础方法,能够在ListView或GridView等子类中使用快速滚动辅助。  

1. 更新ListView中的數據,通過調用BaseAdapter對象的notifyDataSetChanged()方法: 
      mAdapter.notifyDataSetChanged(); 

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

3. 有時我們须要在程序中通過點擊按鈕來控制ListView行的選中,這就用到了在程序中如何使用代碼來選擇ListView項. 
         mListView.requestFocusFromTouch(); 
         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);方法,在這裡面定義你本身的動做就能够了 

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是指短条 
去掉ListView Selector选种时黄色底纹一闪的效果: 
性能

Xml代码  字体

  1. <?xml version="1.0" encoding="utf-8"?>  ui

  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  this

  3.     <solid android:color="@android :color/transparent"/>  spa

  4.     <corners android:radius="0dip" />      .net

  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. }  



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就能够实现滚动条的自动隐藏和显示。 

如何在使用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 的的单选框? 

Java代码  

  1. ListView listView = (ListView)findViewById(R.id.配置文件中ListView的ID);  

  2. //全选遍历ListView的选项,每一个选项就至关于布局配置文件中的RelativeLayout  

  3. for(int i = 0; i < listView.getChildCount(); i++){  

  4.       View view = listView.getChildAt(i);  

  5.       CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);  

  6.       cb.setChecked(true);  

  7. }  



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

Xml代码  

  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>   

  9. 在获取焦点或者选中的状况下设置为白色,其余状况设置为橘黄色。  



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

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

Java代码  

  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监听,而后实现 

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,就不能长按。 这样就能够了 

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下面是确定不会有分割线了。

相关文章
相关标签/搜索