现在的位置: 首页 > 综合 > 正文

ListView的使用

2018年03月19日 ⁄ 综合 ⁄ 共 14050字 ⁄ 字号 评论关闭

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



首先在xml里面定义一个ListView

Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout 
  3.         android:id="@+id/LinearLayout01" 
  4.         android:layout_width="fill_parent" 
  5.         android:layout_height="fill_parent" 
  6.         xmlns:android="http://schemas.android.com/apk/res/android">
  7. <ListView android:layout_width="wrap_content" 
  8.           android:layout_height="wrap_content" 
  9.           android:id="@+id/ListView01"
  10.           />
  11. </LinearLayout>

复制代码

定义ListView每个条目的Layout,用RelativeLayout实现:

Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout 
  3.         android:id="@+id/RelativeLayout01" 
  4.         android:layout_width="fill_parent" 
  5.         xmlns:android="http://schemas.android.com/apk/res/android" 
  6.         android:layout_height="wrap_content" 
  7.         android:paddingBottom="4dip" 
  8.         android:paddingLeft="12dip"
  9.         android:paddingRight="12dip">
  10. <ImageView 
  11.         android:paddingTop="12dip"
  12.         android:layout_alignParentRight="true"
  13.         android:layout_width="wrap_content" 
  14.         android:layout_height="wrap_content" 
  15.         android:id="@+id/ItemImage"
  16.         /> 
  17. <TextView 
  18.     android:text="TextView01" 
  19.     android:layout_height="wrap_content" 
  20.     android:textSize="20dip" 
  21.     android:layout_width="fill_parent" 
  22.     android:id="@+id/ItemTitle"
  23.     />
  24. <TextView 
  25.         android:text="TextView02" 
  26.         android:layout_height="wrap_content" 
  27.         android:layout_width="fill_parent" 
  28.         android:layout_below="@+id/ItemTitle" 
  29.         android:id="@+id/ItemText"
  30.         />
  31. </RelativeLayout>

复制代码

最后在Activity里面调用和加入Listener,具体见注释:
  1. package com.ray.test;

  2. import java.util.ArrayList;
  3. import java.util.HashMap;

  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.ContextMenu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.view.ContextMenu.ContextMenuInfo;
  10. import android.view.View.OnCreateContextMenuListener;
  11. import android.widget.AdapterView;
  12. import android.widget.ListView;
  13. import android.widget.SimpleAdapter;
  14. import android.widget.AdapterView.OnItemClickListener;

  15. public class TestListView extends Activity {
  16.     @Override
  17.     public void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         setContentView(R.layout.main);
  20.         //绑定Layout里面的ListView
  21.         ListView list = (ListView) findViewById(R.id.ListView01);
  22.         
  23.         //生成动态数组,加入数据
  24.         ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
  25.         for(int i=0;i<10;i++)
  26.         {
  27.             HashMap<String, Object> map = new HashMap<String, Object>();
  28.             map.put("ItemImage", R.drawable.checked);//图像资源的ID
  29.             map.put("ItemTitle", "Level "+i);
  30.             map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves! ");
  31.             listItem.add(map);
  32.         }
  33.         //生成适配器的Item和动态数组对应的元素
  34.         SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据源 
  35.             R.layout.list_items,//ListItem的XML实现
  36.             //动态数组与ImageItem对应的子项        
  37.             new String[] {"ItemImage","ItemTitle", "ItemText"}, 
  38.             //ImageItem的XML文件里面的一个ImageView,两个TextView ID
  39.             new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
  40.         );
  41.       
  42.         //添加并且显示
  43.         list.setAdapter(listItemAdapter);
  44.         
  45.         //添加点击
  46.         list.setOnItemClickListener(new OnItemClickListener() {

  47.             @Override
  48.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  49.                     long arg3) {
  50.                 setTitle("点击第"+arg2+"个项目");
  51.             }
  52.         });
  53.         
  54.       //添加长按点击
  55.         list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
  56.             
  57.             @Override
  58.             public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
  59.                 menu.setHeaderTitle("长按菜单-ContextMenu");  
  60.                 menu.add(0, 0, 0, "弹出长按菜单0");
  61.                 menu.add(0, 1, 0, "弹出长按菜单1");  
  62.             }
  63.         }); 
  64.     }
  65.     
  66.     //长按菜单响应函数
  67.     @Override
  68.     public boolean onContextItemSelected(MenuItem item) {
  69.         setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目"); 
  70.         return super.onContextItemSelected(item);
  71.     }
  72. }
 
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)

android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。

android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,

也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。

android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。

android:cursorVisible设定光标为显示/隐藏,默认显示。

android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”

android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。

android:drawableLeft在text的左边输出一个drawable,如图片。

android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。

android:drawableRight在text的右边输出一个drawable。

android:drawableTop在text的正上方输出一个drawable。

android:editable设置是否可编辑。

android:editorExtras设置文本的额外的输入数据。

android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;

”marquee” ——以跑马灯的方式显示(动画横向移动)

android:freezesText设置保存文本的内容以及光标的位置。

android:gravity设置文本位置,如设置成“center”,文本将居中显示。

android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在EditView中使用,但是这里也可以用。

android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细

说明,此处无用。

android:imeActionId设置IME动作ID。

android:imeActionLabel设置IME动作标签。

android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。

android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。

android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。

android:linksClickable设置链接是否点击连接,即使设置了autoLink。

android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。

android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度

android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:maxLength限制显示的文本长度,超出部分不显示。

android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。

android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。

android:minLines设置文本的最小行数,与lines类似。

android:lineSpacingExtra设置行间距。

android:lineSpacingMultiplier设置行间距的倍数。如”1.2”

android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。

android:password以小点”.”显示文本

android:phoneNumber设置为电话号码的输入方式。

android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。

android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。

android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。

android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。

android:shadowDx设置阴影横向坐标开始位置。

android:shadowDy设置阴影纵向坐标开始位置。

android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。

android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine "

android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行

android:text设置显示文本.

android:textAppearance设置文字外观。如“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:

textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor设置文本颜色

android:textColorHighlight被选中文字的底色,默认为蓝色

android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。

android:textColorLink文字链接的颜色.

android:textScaleX设置文字之间间隔,默认为1.0f。

android:textSize设置文字大小,推荐度量单位”sp”,如”15sp”

android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开

android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]

android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)

android:maxHeight设置文本区域的最大高度

android:minHeight设置文本区域的最小高度

android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width的区别看这里。

android:maxWidth设置文本区域的最大宽度

android:minWidth设置文本区域的最小宽度

------------------------------------------好吧,我承认,我是分割线--------------------------------------------

最近做一个通讯录的项目,在显示地址的时候有个需求,就是单行显示,超出到部分用省略号显示

需要设置到属性如下:

android:layout_width="wrap_content"
android:singleLine="true"//单行显示
android:ellipsize="end"//省略号出现在末尾

抱歉!评论已关闭.