android - ListView的使用。

ListView 的功能比较强大,也有很多种使用方法,在这里介绍一种简单的使用方法。首先,看一下效果图:


这个列表的功能是单击某一项时,就选中某一项,并反显它,其它功能同ListView.

要实现上面的效果,需要做一下BaseAdapter,同时需要修改ListView的属性及右边滑块的属性。

下面给出MyListAdapter的代码:

[java]  view plain copy
  1. import java.lang.reflect.Field;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Color;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.*;  
  9.   
  10. public class MyListAdapter extends BaseAdapter{  
  11.   
  12.       
  13.     private Context mContext;  
  14.       
  15.     private boolean[] isFocused ;  
  16.     private TextView[] ItemContent ;  
  17.     private int ItemCount;  
  18.       
  19.     private int whichClick = -1;  
  20.       
  21.     public StoryListAdapter(Context c, String[] str, int length)  
  22.     {  
  23.         this.mContext = c;  
  24.         this.isFocused = new boolean[length];  
  25.         this.ItemContent = new TextView[length];  
  26.         this.ItemCount = length;  
  27.           
  28.         for (int i = 0; i < length; i++)  
  29.         {  
  30.             isFocused[i] = false;  
  31.         }  
  32.   
  33.           
  34.         TextView v;  
  35.         for (int i = 0; i < length; i++)  
  36.         {  
  37.             v = new TextView(mContext);       
  38.             v.setText("◆"+str[i]);  
  39.             v.setTextSize(30);  
  40.             ItemContent[i] = v;  
  41.         }  
  42.     }  
  43.       
  44.       
  45.     //@Override  
  46.     public int getCount()  
  47.     {  
  48.         // TODO Auto-generated method stub                
  49.         //return ListData.length;  
  50.         return ItemCount;  
  51.     }  
  52.   
  53.     //@Override  
  54.     public Object getItem(int position)  
  55.     {  
  56.         // TODO Auto-generated method stub  
  57.         return position;  
  58.     }  
  59.   
  60.     //@Override  
  61.     public long getItemId(int position)  
  62.     {  
  63.         // TODO Auto-generated method stub  
  64.         return position;  
  65.     }  
  66.       
  67.   
  68.     //@Override  
  69.     public View getView(int position, View convertView, ViewGroup parent)  
  70.     {  
  71.         TextView v = ItemContent[position];  
  72.   
  73.         if(isFocused[position])  
  74.             v.setTextColor(Color.WHITE);  
  75.         else  
  76.             v.setTextColor(Color.BLACK);  
  77.           
  78.         v.setBackgroundColor(isFocused[position]?Color.rgb(100,66,24):Color.TRANSPARENT);  
  79.         return v;  
  80.     }     
  81.       
  82.     public void setCurrentSel(int index)  
  83.     {  
  84.         isFocused[whichClick == -1 ? 0 : whichClick] = false;  
  85.         whichClick = index;  
  86.         isFocused[index] = true;  
  87.         notifyDataSetInvalidated();  
  88.     }     
  89.       
  90.     public void setUnCurrentSel()  
  91.     {  
  92.         for (int i = 0; i < ItemCount; i++)  
  93.         {  
  94.             isFocused[i] = false;  
  95.         }         
  96.           
  97.         notifyDataSetInvalidated();  
  98.     }     
  99.       
  100.     public int getCurrentSel()  
  101.     {  
  102.         int ret = 0 ;  
  103.           
  104.         if(whichClick != -1)  
  105.             ret = whichClick;   
  106.           
  107.         return ret;  
  108.     }  
  109.       
  110. }  

在主程序中用下面的方式进行调用:

[java]  view plain copy
  1. String[] ListTestData = {"测试数据1","测试数据2","测试数据3","测试数据4","测试数据5","测试数据6","测试数据7","测试数据8","测试数据9","测试数据10","测试数据11","测试数据12","测试数据13","测试数据14","测试数据15","测试数据16"};  
  2. MyListAdapter myListAdapter;  
  3.   
  4.   
  5. listview = (ListView)findViewById(R.id.main_list_view);  
  6. myListAdapter = new MyListAdapter(this,ListTestData,ListTestData.length);          
  7.   
  8. listview.setAdapter(storyListAdapter);          
  9. storyListAdapter.setCurrentSel(0);  

到此,基本上就实现了上面的效果,但是还有很多问题,我们一个一个来解决:

1、单击列表后,列表的背景变成了黑色了。可以指定android:cacheColorHint的属性来放变它,我们需要将它指定为透明。使用下面的属性值:

android:cacheColorHint="#000000"

2、去除列表项中间的分割线:android:divider="#00000000",这里的值也可以指向一个drawable图片对象(android:divider="@drawable/list_line"),如果使用了图片高度大于系统的像素的话,可以自己设定一个高度。android:dividerHight="10px"

3、listview在拖动时,listview的背景变成黑色。可以使用下面的代码时行解决:android:scrollingCache="false"

4、listview的上边和下边有黑色的阴影。可以使用下面的代码进行解决:android:fadingEdge="none"

5、listview右边的滑动条覆盖列表项的内容。可以使用下面的代码进行解决:android:scrollbarStyle="outsideInset"

6、修改listvew右边的滑动条与列表项之间的距离。可以使用下面代码进行解决:android:paddingRight="10dip",可以根据需要进行修改。

7、修改右边的滑动条显示的颜色。可以使用下面的代码进行解决:

    android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
    android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"  

其中scrollbar_vertical_track和scrollbar_vertical_thumb是滑动条的XML配置文件,在DemoAPI中有,你只要根据自己的需要修改一下开始颜色和结束颜色即可。下面给出xml文件的内容:

scrollbar_vertical_track.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
  3.      <gradient android:startColor="#D6C9B5" android:endColor="#D6C9B5"   
  4.             android:angle="0"/>  
  5.     <corners android:radius="0dp" />  
  6. </shape>  

scrollbar_vertical_thumb.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <gradient android:startColor="#634117" android:endColor="#634117"  
  4.             android:angle="0"/>  
  5.     <corners android:radius="6dp" />  
  6. </shape>  

其中android:startColor="#D6C9B5"为#RGB的开始颜色。

8、单击Item时,无背景颜色变化,需要在ListView中指定它的listSelector属性,如下:

android:listSelector="@layout/list_press"

list_press.xml的内容如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">   
  3.  <item android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />  
  4. </selector>   

到此,基上已经完成了上面的效果。

下面给出所有的完整的ListView属性设置项:

[html]  view plain copy
  1. <ListView  
  2.     android:id="@+id/main_list_view"    
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:scrollingCache="false"  
  6.     android:fadingEdge="none"  
  7.     android:cacheColorHint="#000000"  
  8.     android:divider="#00000000"  
  9.     android:scrollbarStyle="outsideInset"  
  10.     android:paddingRight="10dip"  
  11.     android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"  
  12.     android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"      
  13.     android:listSelector="@layout/list_press" >  

9、如何使用和自定义FastScroller,在ListView的右边显示一个滑块,效果图如下:


要实现它,很容易,只需要在ListView中设置它的属性即可,如下:

[html]  view plain copy
  1. android:fastScrollEnabled="true"   
  2. android:focusable="true"   

但是有时候会发现设置属性无效,滚动ListView并未出现滑块。原因是该属性生效有最小记录限制。当ListView记录能够在4屏以内显示(也就是说滚动4页)就不会出现滑块。可能是api设计者认为这么少的记录不需要快速滚动。

如何修改FastScroller那个滑块的图片呢,效果图如下:


可以使用下面的代码:

[javascript]  view plain copy
  1. try {  
  2.     Field f = AbsListView.class.getDeclaredField("mFastScroller");  
  3.     f.setAccessible(true);  
  4.     Object o = f.get(listview);  
  5.     f = f.getType().getDeclaredField("mThumbDrawable");  
  6.     f.setAccessible(true);  
  7.     Drawable drawable = (Drawable) f.get(o);  
  8.         //R.drawable.scrollbar为自己自定义的图片  
  9.     drawable = getResources().getDrawable(R.drawable.scrollbar);  
  10.     f.set(o, drawable);  
  11. catch (Exception e) {  
  12.     throw new RuntimeException(e);  
  13. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值