Android ListView 几个重要属性

来源:互联网 发布:网络拒绝接入什么意思 编辑:程序博客网 时间:2024/05/20 03:08


Android ListView 几个重要属性

Android ListView 几个重要属性
http://blog.csdn.net/avenleft/article/details/7334060

 

android:transcriptMode="alwaysScroll"   

android:cacheColorHint="#00000000"

android:listSelector="@color/pink" listView item 选中时的颜色。默认为橙黄底色。

 

android:divider="#f9b68b"  //分割线颜色

android:dividerHeight="1dp"  //分割线边距

android:scrollbars="none"  //不显示滚动条

android:fadingEdge="none"   去掉上边和下边黑色的阴影

 

// 设置Item之间无间隙

android:divider="#00000000" 或者在javaCode中如下定义:listView.setDividerHeight(0);

android:divider="@drawable/list_driver" 设置分割线的图片资源,如果则只要设置为

android:divider="@drawable/@null" 不想显示分割线

 

android:scrollbars="none" setVerticalScrollBarEnabled(true); 隐藏listView的滚动条

android:fadeScrollbars="true" 设置为true就可以实现滚动条的自动隐藏和显示

 

android:transcriptMode="alwaysScroll"    用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。

 

android:fadingEdge="none" 去掉上边和下边黑色的阴影

 

android:fastScrollEnabled="false"
android:fastScrollEnabled = "true" 加快滑动速度

android:drawSelectorOnTop="false"
android:scrollingCache="false" ??????????????

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

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

 


首先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就可以实现滚动条的自动隐藏和显示。

 

第八fastScrollEnabled属性 ,

很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。

 

第九drawSelectorOnTop属性

When set to true, the selector will be drawn over the selecteditem. Otherwise the selector is drawn behind the selected item. Thedefault value is false.

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

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






choiceMode使用


首先看效果图:

 

       Android进阶:ListView深入学习 choiceMode使用及自定义Adapter_www.fengfly.com             Android进阶:ListView深入学习 choiceMode使用及自定义Adapter_www.fengfly.com                

 

这个是多选模式的

 

 

首先看Layout配置文件

 

 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     >    
  7.     <Button 
  8.         android:id="@+id/addButton" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="wrap_content"   
  11.         android:text="增加一个" 
  12.         /> 
  13.     <!-- android:scrollbarFadeDuration 一直显示滚动条   android:fastScrollEnabled  显示拖动块--> 
  14. <ListView   
  15.         android:id="@id/android:list"   
  16.         android:layout_width="fill_parent" 
  17.         android:divider="#ee31ff5e" 
  18.         android:dividerHeight="1dp" 
  19.         android:choiceMode="multipleChoice" 
  20.         android:layout_height="fill_parent" 
  21.         android:fastScrollEnabled="true" 
  22.         android:focusable="true"   
  23.         android:scrollbarFadeDuration="0"/> 
  24. </LinearLayout> 

 

其中的android:choiceMode="multipleChoice"选项就是设置选择模式的,

 

他包括几个选择 CHOICE_MODE_MULTIPLE(多选),CHOICE_MODE_NONE(默认),CHOICE_MODE_SINGLE(单选)

 

这里还设置了divider

 

下面看代码

 

 

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.util.Random;  
  4. import android.app.ListActivity;  
  5. import android.content.Context;  
  6. import android.database.Cursor;  
  7. import android.os.Bundle;  
  8. import android.view.Gravity;  
  9. import android.view.LayoutInflater;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.view.View.OnTouchListener;  
  14. import android.widget.AdapterView;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.Button;  
  18. import android.widget.ListView;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21. import android.widget.AdapterView.OnItemClickListener;  
  22. public class ListViewDemo2 extends ListActivity{  
  23.     private Cursor cursor;  
  24.       
  25.     private Button button;  
  26.       
  27.     private TextView textViewFooter;  
  28.       
  29.     private TextView textViewHeader;  
  30.       
  31.     private ArrayAdapter<String> adapter ;  
  32.       
  33.     private int counter = 10;  
  34.       
  35.     private List<String> list = new ArrayList<String>();  
  36.       
  37.     @Override 
  38.     protected void onCreate(Bundle savedInstanceState) {  
  39.           
  40.         list.add("aa");  
  41.         list.add("bb");  
  42.         list.add("cc");  
  43.         list.add("dd");  
  44.         list.add("ee");  
  45.         list.add("ff");  
  46.         list.add("gg");  
  47.         list.add("hh");  
  48.         list.add("ii");  
  49.         list.add("jj");  
  50.         list.add("kk");  
  51.         list.add("ll");  
  52.         list.add("mm");  
  53.         list.add("nn");  
  54.           
  55.         super.onCreate(savedInstanceState);  
  56.         setContentView(R.layout.listviewdemo2);  
  57.         final ListView listView= (ListView) findViewById(android.R.id.list);  
  58.         textViewHeader = new TextView(this);  
  59.         textViewHeader.setGravity(Gravity.CENTER);  
  60.         textViewHeader.setTextSize(17);  
  61.         textViewFooter = new TextView(this);  
  62.         textViewFooter.setGravity(Gravity.CENTER);  
  63.         textViewFooter.setText("点击查看更多");  
  64.         textViewFooter.setTextSize(18);  
  65.         textViewHeader.setText("全部信息("+list.size()+")");  
  66.         listView.addHeaderView(textViewHeader);  
  67.         listView.addFooterView(textViewFooter);  
  68.           
  69.         adapter = new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);  
  70.         listView.setOnItemClickListener(new OnItemClickListener(){  
  71.             @Override 
  72.             public void onItemClick(AdapterView<?> parent, View view,  
  73.                     int position, long id) {  
  74.                 String strtemp = "";  
  75.                 for(long ids :listView.getCheckItemIds()){  
  76.                     strtemp += ids+":";  
  77.                 }  
  78.                 Toast.makeText(ListViewDemo2.this""+strtemp, Toast.LENGTH_LONG).show();  
  79.                   
  80.             }});  
  81.           
  82.         setListAdapter(adapter);  
  83.           
  84.         listView.setOnTouchListener(new OnTouchListener(){  
  85.             @Override 
  86.             public boolean onTouch(View v, MotionEvent event) {  
  87.                 switch (event.getAction()) {  
  88.                 case MotionEvent.ACTION_DOWN:  
  89.                     //获得当前点击位置的item序号  
  90.                     int itemnum = listView.pointToPosition((int)event.getX(), (int)event.getY());   
  91.                     //获得当前点击位置的RowId,为-1的除外  
  92.                     long temp = listView.pointToRowId((int)event.getX(), (int)event.getY());  
  93.                     Toast.makeText(ListViewDemo2.this""+itemnum+":"+temp, Toast.LENGTH_LONG).show();  
  94.                     break;  
  95.                 default:  
  96.                     break;  
  97.                 }  
  98.                 return false;  
  99.             }});  
  100.           
  101.         button = (Button) findViewById(R.id.addButton);  
  102.         button.setOnClickListener(new View.OnClickListener(){  
  103.             @Override 
  104.             public void onClick(View v) {  
  105.                 Random random = new Random();  
  106.                 int position = random.nextInt(list.size());  
  107.                 list.add(position, ""+counter++);  
  108.                 adapter.notifyDataSetInvalidated();  
  109.                 textViewHeader.setText("全部信息("+list.size()+")");  
  110.             }  
  111.               
  112.         });  
  113.           
  114.     }  
  115.       

 

通过android已定义的ArrayAdapter来显示数据,效果如图,

 

里面添加了三个事件:

 

1、OnTouchListener  这里通过触摸点来定位这个list的position信息,包括两个方法 pointToPosition和pointToRowId,注意这两个方法的不同点,就是在状态为-1的数据是否计算的区别

 

2、OnItemClickListener 这里获得当前选择的条目 通过方法getCheckItemIds来获得

 

3、Button的点击,这里动态增加一条数据项,可以发现通过getCheckItemIds来标记的选择项是通过位置来记录的,跟选择选项的内容无关,所以这里如果数据是动态的就要需要注意

 

还有一个问题,刚开始我

new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);

 

这里构造方法传入的是一个数组, 这样就发现了一个问题:

在我点击button当然是数组数据增加一条,但是发现list中的数据没有变化,

这个是为什么呢,难道是传入的集合跟ArrayAdapter中的集合不是同一个引用,那又发现了ArrayAdapter中有add和insert方法,但用了之后发现有java.lang.UnsupportedOperationException这个异常,android居然还没实现,真是奇怪啊,

 

后来详细看了下ArrayAdapter这个类的构造方法,原来传入list跟数据操作不同,如果是list直接用该引用,如果传入数组,就会通过Arrays.asList()来创造一个新List 这个区别就太大了, 后来只能把数组改成List 真是郁闷啊

 

 

这里使用的是ArrayAdapter ,那很多时候我们需要自定义Adater的,可能会处于数据处理,效率优化的考虑,

 

如果自定义Adapter如下

 

 

  1. class MyAdapter extends BaseAdapter{  
  2.         @Override 
  3.         public int getCount() {  
  4.             return list.size() ;  
  5.         }  
  6.         @Override 
  7.         public Object getItem(int position) {  
  8.             return list.get(position);  
  9.         }  
  10.         @Override 
  11.         public long getItemId(int position) {  
  12.             return position;  
  13.         }  
  14.         @Override 
  15.         public View getView(int position, View convertView, ViewGroup parent) {  
  16.             TextView tv = new TextView(ListViewDemo2.this);  
  17.             tv.setText(list.get(position));  
  18.             tv.setHeight(30);  
  19.             tv.setGravity(Gravity.CENTER);  
  20.             return tv;  
  21.         }  
  22.           
  23.     } 

 

这样定义显示的时候就会发现多选按钮框不见了,看ArrayAdapter的实现就会发现,他所用的 android.R.layout.simple_list_item_multiple_choice布局用的是CheckedTextView组件

 

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <CheckedTextView android:textAppearance="?textAppearanceLarge" android:gravity="center_vertical" android:id="@id/text1" android:paddingLeft="6.0dip" android:paddingRight="6.0dip" android:layout_width="fill_parent" android:layout_height="?listPreferredItemHeight" android:checkMark="?listChoiceIndicatorMultiple" 
  3.   xmlns:android="http://schemas.android.com/apk/res/android" /> 

 

所以这里如果用TextVew就不会显示选择提示框,其实这个组件就是TextView的子类

 

这里我们要用这个组件

 

 

  1. class MyAdapter extends BaseAdapter{  
  2.         @Override 
  3.         public int getCount() {  
  4.             return list.size() ;  
  5.         }  
  6.         @Override 
  7.         public Object getItem(int position) {  
  8.             return list.get(position);  
  9.         }  
  10.         @Override 
  11.         public long getItemId(int position) {  
  12.             return position;  
  13.         }  
  14.         @Override 
  15.         public View getView(int position, View convertView, ViewGroup parent) {  
  16.             LayoutInflater inflater = (LayoutInflater)getApplication().getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  17.             View view = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);  
  18.             TextView tv = (TextView)view;  
  19.             tv.setText(list.get(position));  
  20.             tv.setHeight(30);  
  21.             tv.setGravity(Gravity.CENTER);  
  22.             return tv;  
  23.         }  
  24.           
  25.     } 

 

这样就正确显示了
0 0
原创粉丝点击