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>  

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

原文地址:https://www.cnblogs.com/wwwroot/p/2860835.html