請尊重個人勞動成果,轉載註明出處,謝謝!
http://blog.csdn.net/xiaxiazaizai01
第一次寫博客,內心還是有點小緊張,廢話不多說,老規矩,上效果圖:
因爲項目需要,需求是做一個行列都不確定的表格,其實,實現一個表格可以採用多種方式,這裏我採用的是用ListView+GridView的方式實現,老鳥請繞道,菜鳥勿噴啊….額,又說了很多廢話,我的一貫風格是直奔主題,哈哈。。。上代碼
首先是XML文件,這裏我們只需要定義個listview控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#ffffff"
android:padding="16dp"
android:dividerHeight="1dp"
/>
</RelativeLayout>
gridview則作爲listview的item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.ch.MyGridView
android:id="@+id/myGridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp"
/>
</RelativeLayout>
大家都知道listview嵌套gridview時,經常會出現gridview只顯示一行的情況,這裏我們重寫gridview
public class MyGridView extends GridView {
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
而gridview的item中我們只放一個textview(這裏就不再繁瑣了)
下面開始寫我們的適配器
首先是ListViewAdapter:
public class ListViewAdapter extends BaseAdapter {
private Context context;
private List<TestBean> list;
public ListViewAdapter(Context context,List<TestBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.item_listview, null);
holder = new ViewHolder();
holder.gridView = (MyGridView) convertView.findViewById(R.id.myGridView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
//表格的橫向縱向數目都是不確定的,這裏獲取給出的列數
holder.gridView.setNumColumns(list.get(position).getColumnData().size());
GridViewAdapter gridViewAdapter = new GridViewAdapter(context,list.get(position).getColumnData(),position);
holder.gridView.setAdapter(gridViewAdapter);
return convertView;
}
class ViewHolder{
private MyGridView gridView;
}
}
然後是GridViewAdapter:
public class GridViewAdapter extends BaseAdapter {
private Context context;
private List<ColumnBean> list;
private int lvPosition;//ListView每個item顯示的位置,用於設置不同item的不同顏色
public GridViewAdapter(Context context, List<ColumnBean> list,int lvPosition) {
this.context = context;
this.list = list;
this.lvPosition = lvPosition;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.item_gridview, null);
holder = new ViewHolder();
holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
if(lvPosition == 0){ //listview中的第一個item的背景顏色
holder.tvContent.setBackgroundColor(Color.parseColor("#4f81ff"));
}else{
if((lvPosition - 1) % 2 == 0){ //偶數行
holder.tvContent.setBackgroundColor(0xffd0d8e8);
}else{ //除了第一行以外的奇數行
holder.tvContent.setBackgroundColor(Color.GRAY);
}
}
holder.tvContent.setText(list.get(position).getData());
return convertView;
}
class ViewHolder{
private TextView tvContent;
}
}
上面adapter中涉及到兩個實體類,接下來是我們的實體類了
public class TestBean implements Serializable {
private List<ColumnBean> columnData;
public List<ColumnBean> getColumnData() {
return columnData;
}
public void setColumnData(List<ColumnBean> columnData) {
this.columnData = columnData;
}
}
public class ColumnBean implements Serializable {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public ColumnBean(String data) {
this.data = data;
}
}
最後再看下我們的主Activity部分
public class OtherActivity extends AppCompatActivity {
private ListViewAdapter lvAdapter;
private List<TestBean> lineList;
private List<ColumnBean> columnList;
private ListView myListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
setTitle("OtherActivity");
myListView = (ListView) findViewById(R.id.lv);
//測試數據
lineList = new ArrayList<TestBean>();
for(int i=0;i<6;i++){//設置有多少行
TestBean testBean = new TestBean();
columnList = new ArrayList<>();
testBean.setColumnData(columnList);
for(int j=0;j<5;j++){//設置有多少列
ColumnBean columnBean = new ColumnBean("測試列"+j);
columnList.add(columnBean);
}
lineList.add(testBean);
}
lvAdapter = new ListViewAdapter(this,lineList);
myListView.setAdapter(lvAdapter);
}
}