zoukankan      html  css  js  c++  java
  • ListView在应用开发中较为常用的做法

    首先声明下,这是本人自己使用的做法,可能并不适合每个人,但是具有参考意义,分享给大家,不足的地方希望有人能提出来。

    ListView在做应用的时候是经常被使用到的。一般开发应用程序的时候,我们会先做界面。这个时候,遇到ListView,我们会先模拟一些数据,而且,每个ListView通常都有类型的行为,比如,ListView的每个Item的点击效果,Item之间的横线,等等,而通常我们不会去使用自带的list item 的布局,而是自己去写一个布局,然后在自定义的Adapter中去inflate它。在多个地方都使用到这些特性,那么我们就可以把这些特性放到父类中来处理。而对于界面中共同的元素我们会放到style中去处理。
    先看MainAdapter.java:
    Java代码:  
    1. public class MainAdapter extends BaseCompatableAdapter<Map<String, String>> {  
    2.     public MainAdapter(Context context, List<Map<String, String>> data) {  
    3.         super(context, data);     
    4.     }  
    5.     class ViewHolder {  
    6.   
    7.         ImageView ivPic;  
    8.         TextView tvName;  
    9.     }  
    10.     @Override  
    11.     public View getView(int position, View convertView, ViewGroup parent) {  
    12.         // TODO Auto-generated method stub  
    13.         final ViewHolder viewHolder;  
    14.         if (convertView == null) {  
    15.   
    16.             convertView = super.layoutInflater  
    17.                     .inflate(R.layout.list_item, null);  
    18.             viewHolder = new ViewHolder();  
    19.             viewHolder.ivPic = (ImageView) convertView  
    20.                     .findViewById(R.id.iv_pic);  
    21.             viewHolder.tvName = (TextView) convertView  
    22.                     .findViewById(R.id.tv_name);  
    23.   
    24.             convertView.setTag(viewHolder);  
    25.         } else {  
    26.   
    27.             viewHolder = (ViewHolder) convertView.getTag();  
    28.         }  
    29.           
    30.         //TODO 接下去对数据进行绑定...  
    31.   
    32.         return convertView;  
    33.     }  
    34. }  

     这里面做的事情非常简单,因为我把部分代码移到了父类BaseCompatableAdapter中,

    下面看父类
    BaseCompatableAdapter.java:
    Java代码:  
    1. public abstract class BaseCompatableAdapter<T> extends BaseAdapter {  
    2.     protected Context context;  
    3.     private List<T> data;  
    4.     protected LayoutInflater layoutInflater;  
    5.   
    6.     public BaseCompatableAdapter(Context context, List<T> data) {  
    7.         this.context = context;  
    8.         this.data = data;  
    9.         layoutInflater = (LayoutInflater) context  
    10.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    11.     }  
    12.     @Override  
    13.     public int getCount() {  
    14.         // TODO Auto-generated method stub  
    15.         if (data == null)  
    16.             return 0;  
    17.         return data.size();  
    18.     }  
    19.     @Override  
    20.     public T getItem(int position) {  
    21.         // TODO Auto-generated method stub  
    22.         return data.get(position);  
    23.     }  
    24.     @Override  
    25.     public long getItemId(int position) {  
    26.         // TODO Auto-generated method stub  
    27.         return position;  
    28.     }  
    29. }  

     覆写过BaseAdapter的同学应该可以知道,实际上就是把BaseAdapter的部分方法在这里面覆写了。以后你的其他的Adapter都继承自这个Adapter,那么可以省下不少的代码量。

    原文参考自站长网http://www.software8.co/wzjs/yidongkaifa/2645.html
    最后看主界面:
    MainActivity.java:
    Java代码:  
    1. public class MainActivity extends Activity {  
    2.   
    3.     private ListView lvData;  
    4.       
    5.     @Override  
    6.     protected void onCreate(Bundle savedInstanceState) {  
    7.         super.onCreate(savedInstanceState);  
    8.         setContentView(R.layout.activity_main);  
    9.           
    10.         lvData = (ListView)findViewById(R.id.lv_data);   
    11.         List<Map<String, String>> dataList = new ArrayList<Map<String, String>>();   
    12.         Map<String, String> map;  
    13.         for(int i = 0; i < 50; i++){//模拟数据量,当并没有加入真实的数据源  
    14.             map = new HashMap<String, String>();  
    15.             dataList.add(map);  
    16.         }  
    17.         lvData.setAdapter(new MainAdapter(this, dataList));  
    18.     }  
    19. }  

    上面是关于代码中如何较为简洁的处理ListView和Adapter,下面则是设置ListView的界面

    用一个style来设置每个ListView公用的地方,如下:
    res/values/styles.xml:
    Java代码:  
    1. <resources>  
    2.   
    3.     <style name="listview_style" parent="@android:style/Widget.ListView">  
    4.         <!-- <item name="android:listSelector">@drawable/list_item_bg_selecter</item> -->  
    5.         <item name="android:divider">@drawable/line</item><!-- @drawable/list_item_line -->  
    6.         <item name="android:cacheColorHint">@null</item>  
    7.     </style>  
    8.   
    9. </resources>  

     这里面设置了divider,即Item之间的横线,cacheColor设置为null,listSelector可以根据自己的需求进行设置,不过,没有必要设置了这里。

    你的listview可以这样引用style:
    Java代码:  
    1. <ListView  
    2.         android:id="@+id/lv_data"  
    3.         android:layout_width="fill_parent"  
    4.         android:layout_height="fill_parent"  
    5.         style="@style/listview_style"  
    6.          />  
    下面我们看看list Item
    res/layout/list_item.xml:
    Java代码:  
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="wrap_content"  
    4.     android:layout_height="wrap_content"  
    5.     android:background="@drawable/list_item_bg_selecter"  
    6.      >   
    7.     <ImageView   
    8.         android:id="@+id/iv_pic"  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:layout_alignParentLeft="true"  
    12.         android:layout_centerVertical="true"  
    13.         android:src="@drawable/ic_launcher"  
    14.         android:layout_margin="5dip"  
    15.         />  
    16.     <TextView   
    17.         android:id="@+id/tv_name"  
    18.         android:layout_width="wrap_content"  
    19.         android:layout_height="wrap_content"  
    20.         android:layout_centerVertical="true"  
    21.         android:layout_marginLeft="10dip"  
    22.         android:layout_toRightOf="@+id/iv_pic"  
    23.         android:text="张三"  
    24.         />  
    25.       
    26. </RelativeLayout>  

    注意在这里面我设置了android:background="@drawable/list_item_bg_selecter"这是关键,这里决定了ListView的每个Item的点击效果:

    res/drawable/list_item_bg_selector.xml:
    Java代码:  
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
    3.   
    4.     <item android:drawable="@drawable/list_item_bg_sel" android:state_pressed="true"/>  
    5.     <item android:drawable="@drawable/list_item_bg_sel" android:state_focused="true"/>  
    6.     <item android:drawable="@drawable/list_item_bg_sel" android:state_selected="true"/>  
    7.     <item android:drawable="@drawable/list_item_bg_nor"/>  
    8.   
    9. </selector>  
    这个selector中用到的图片可以是普通图片,也可以是自己画的图片,比如:
    res/drawable/list_item_bg_sel.xml:
    Java代码:  
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:shape="rectangle" >  
    4.     <solid android:color="#efece7" />  
    5.   
    6. </shape>  

    list_item_bg_nor.xml也是一样,只不过设置不同的颜色。

    当然横线你也可以自己画,比如:
    res/drawable/line.xml:
    Java代码:  
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:shape="rectangle" >  
    4.       <stroke android:width="1dp" />  
    5.     <size android:height="3dp" />  
    6.     <solid android:color="#efece7" />  
    7. </shape>  

    下面附上效果图和项目结构图:

  • 相关阅读:
    MPlayer源代码分析
    洛谷 P1025 数的划分
    洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair
    洛谷 P1744 采购特价商品
    洛谷 P1443 马的遍历
    洛谷 P1294 高手去散步
    洛谷 P2104 二进制
    洛谷 P1088 火星人
    洛谷 P1062 数列
    洛谷 P2005 A/B Problem II
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2860835.html
Copyright © 2011-2022 走看看