前言
几种适配器里面相对来说比较简单的一种适配器,在使用时需要实现几个方法,并且也需要对convertView进行优化
此篇文章以使用listView与BaseAdapter来实现表格样式的布局举例(表格布局的实现也可以使用grideView).
效果图如下
大致思路
1.在主布局中添加表格头标题和listView
2.在子条目中添加多个水平的textView来进行列的显示,使用view来进行竖线的绘制
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.jing.www.tabledemo.MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="20dp" > <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:text="基金代码" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:text="基金名称" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:text="单位净值" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:text="累计净值" android:gravity="center"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:text="基金类型" android:gravity="center" /> </LinearLayout> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
1 public class MainActivity extends AppCompatActivity { 2 3 private ListView lv; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 lv = (ListView)findViewById(R.id.lv); 10 /*--------------context,data,条目布局,null,null-------------*/ 11 12 lv.setAdapter(new MyAdapter(this)); 13 } 14 15 16 17 }
1 package com.jing.www.tabledemo; 2 3 import android.content.Context; 4 import android.view.LayoutInflater; 5 import android.view.View; 6 import android.view.ViewGroup; 7 import android.widget.BaseAdapter; 8 import android.widget.TextView; 9 10 /** 11 * Created by Administrator on 2017/6/7. 12 */ 13 14 public class MyAdapter extends BaseAdapter { 15 private Context context; 16 private final LayoutInflater mInflater; 17 18 public MyAdapter(Context context) { 19 this.context=context; 20 mInflater = LayoutInflater.from(context); 21 22 23 } 24 25 /*--------------列表的总条目数-------------*/ 26 @Override 27 public int getCount() { 28 return 20; 29 } 30 31 /*--------------获取数据集中与列表对应的数据项-------------*/ 32 @Override 33 public Object getItem(int position) { 34 35 return position; 36 } 37 38 /*--------------获取列表的position-------------*/ 39 @Override 40 public long getItemId(int position) { 41 return position; 42 } 43 44 45 /*--------------获取列表的view-------------*/ 46 @Override 47 public View getView(int position, View convertView, ViewGroup parent) { 48 ViewHolder holder = null; 49 //如果缓存convertView为空,则需要创建View 50 if(convertView == null) 51 { 52 holder = new ViewHolder(); 53 //根据自定义的Item布局加载布局 54 convertView =mInflater.inflate(R.layout.list_item, null); 55 holder.tv1 = (TextView) convertView.findViewById(R.id.clumn1); 56 holder.tv2 = (TextView) convertView.findViewById(R.id.clumn2); 57 holder.tv3=(TextView) convertView.findViewById(R.id.clumn3); 58 holder.tv4 = (TextView) convertView.findViewById(R.id.clumn4); 59 holder.tv5 = (TextView) convertView.findViewById(R.id.clumn5); 60 61 //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag 62 convertView.setTag(holder); 63 }else 64 { 65 holder = (ViewHolder)convertView.getTag(); 66 } 67 holder.tv1.setText("你好"); 68 return convertView; 69 } 70 71 class ViewHolder { 72 public TextView tv1; 73 public TextView tv2; 74 public TextView tv3; 75 public TextView tv4; 76 public TextView tv5; 77 78 } 79 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal" 6 > 7 <TextView 8 android:id="@+id/clumn1" 9 android:layout_width="0dp" 10 android:layout_weight="1" 11 android:layout_height="match_parent" 12 android:text="10001" 13 android:gravity="center"/> 14 <View 15 android:layout_width="0.5px" 16 android:layout_height="fill_parent" 17 android:background="#B8B8B8" 18 android:visibility="visible" /> 19 <TextView 20 android:id="@+id/clumn2" 21 android:layout_width="0dp" 22 android:layout_weight="1" 23 android:layout_height="match_parent" 24 android:text="易记天天理财A" 25 android:gravity="center"/> 26 <View 27 android:layout_width="0.5px" 28 android:layout_height="fill_parent" 29 android:background="#B8B8B8" 30 android:visibility="visible" /> 31 32 <TextView 33 android:id="@+id/clumn3" 34 android:layout_width="0dp" 35 android:layout_weight="1" 36 android:layout_height="match_parent" 37 android:text="1" 38 android:gravity="center"/> 39 <View 40 android:layout_width="0.5px" 41 android:layout_height="fill_parent" 42 android:background="#B8B8B8" 43 android:visibility="visible" /> 44 45 <TextView 46 android:id="@+id/clumn4" 47 android:layout_width="0dp" 48 android:layout_height="match_parent" 49 android:layout_weight="1" 50 android:text="101" 51 android:gravity="center"/> 52 <View 53 android:layout_width="0.5px" 54 android:layout_height="fill_parent" 55 android:background="#B8B8B8" 56 android:visibility="visible" /> 57 58 <TextView 59 android:id="@+id/clumn5" 60 android:layout_width="0dp" 61 android:layout_weight="1" 62 android:layout_height="match_parent" 63 android:text="股票型" 64 android:gravity="center"/> 65 66 </LinearLayout>
3.功能扩展,在原有基础上实现表格各行颜色的渲染(颜色的交互)
首先要知道listview的工作原理,每次得到一个item,listview都会通过getview来绘制一个item,在getview方法中,可以设置这个item的各种属性,如颜色,布局等等。
1 public View getView(final int position, View convertView, ViewGroup parent){ 2 3 //第一个参数position为listview的item序号,每个item的序号都是不同的。 4 5 //第二个参数convertView为View的缓存,当listview的item过多时,拖动会遮住一部分item,被遮住的item的view就是convertView保存着。 6 7 // 第三个参数parent表示是一个ViewGroup(view组) 8 9 }
效果图(瞬间感觉穿上了衣服)
只需要修改getView即可
1 /*--------------获取列表的view-------------*/ 2 @Override 3 public View getView(int position, View convertView, ViewGroup parent) { 4 ViewHolder holder = null; 5 //如果缓存convertView为空,则需要创建View 6 if(convertView == null) 7 { 8 holder = new ViewHolder(); 9 //根据自定义的Item布局加载布局 10 convertView =mInflater.inflate(R.layout.list_item, null); 11 holder.tv1 = (TextView) convertView.findViewById(R.id.clumn1); 12 holder.tv2 = (TextView) convertView.findViewById(R.id.clumn2); 13 holder.tv3=(TextView) convertView.findViewById(R.id.clumn3); 14 holder.tv4 = (TextView) convertView.findViewById(R.id.clumn4); 15 holder.tv5 = (TextView) convertView.findViewById(R.id.clumn5); 16 17 //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag 18 convertView.setTag(holder); 19 }else 20 { 21 holder = (ViewHolder)convertView.getTag(); 22 } 23 holder.tv1.setText("你好"); 24 int[] colors = { Color.WHITE, Color.rgb(219, 238, 244) };//RGB颜色 25 26 convertView.setBackgroundColor(colors[position % 2]);// 每隔item之间颜色不同 27 return convertView; 28 }