欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android提高之ListView实现自适应表格的方法

程序员文章站 2022-05-16 12:28:13
前面有文章介绍了使用gridview实现表格的方法,本文就来说说如何用listview实现自适应的表格。gridview比listview更容易实现自适应的表格,但是gri...

前面有文章介绍了使用gridview实现表格的方法,本文就来说说如何用listview实现自适应的表格。gridview比listview更容易实现自适应的表格,但是gridview每个格单元的大小固定,而listview实现的表格可以自定义每个格单元的大小,但因此实现自适应表格也会复杂些(主要由于格单元大小不一)。此外,gridview实现的表格可以定位在具体某个格单元,而listview实现的表格则只能定位在表格行。因此还是那句老话:根据具体的使用环境而选择gridview 或者 listview实现表格。

先来看看本文程序运行的效果图,如下图所示:

Android提高之ListView实现自适应表格的方法

本文实现的listview表格,可以每个格单元大小不一,文本(textview)或图片(imageview)做格单元的数据,不需要预先定义xml实现样式(自适应的根本目标)。由于listview置于horizontalscrollview中,因此对于列比较多/列数据比较长的数据表也能很好地适应其宽度。

main.xml源码如下:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <horizontalscrollview android:id="@+id/horizontalscrollview01"
 android:layout_height="fill_parent" android:layout_width="fill_parent">
 <listview android:id="@+id/listview01" android:layout_height="wrap_content"
  android:layout_width="wrap_content"></listview>
 </horizontalscrollview>
</linearlayout>

主类testmylistview.java的源码如下:

package com.testmylistview;
import java.util.arraylist;
import com.testmylistview.tableadapter.tablecell;
import com.testmylistview.tableadapter.tablerow;
import android.app.activity;
import android.os.bundle;
import android.view.view;
import android.widget.adapterview;
import android.widget.listview;
import android.widget.linearlayout.layoutparams;
import android.widget.toast;
/**
 * @author hellogv
 */
public class testmylistview extends activity {
 /** called when the activity is first created. */
 listview lv;
 @override
 public void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.main);
 this.settitle("listview自适应实现表格---hellogv");
 lv = (listview) this.findviewbyid(r.id.listview01);
 arraylist<tablerow> table = new arraylist<tablerow>();
 tablecell[] titles = new tablecell[5];// 每行5个单元
 int width = this.getwindowmanager().getdefaultdisplay().getwidth()/titles.length;
 // 定义标题
 for (int i = 0; i < titles.length; i++) {
  titles[i] = new tablecell("标题" + string.valueof(i), 
   width + 8 * i,
   layoutparams.fill_parent, 
   tablecell.string);
 }
 table.add(new tablerow(titles));
 // 每行的数据
 tablecell[] cells = new tablecell[5];// 每行5个单元
 for (int i = 0; i < cells.length - 1; i++) {
  cells[i] = new tablecell("no." + string.valueof(i),
   titles[i].width, 
   layoutparams.fill_parent, 
   tablecell.string);
 }
 cells[cells.length - 1] = new tablecell(r.drawable.icon,
   titles[cells.length - 1].width, 
   layoutparams.wrap_content,
   tablecell.image);
 // 把表格的行添加到表格
 for (int i = 0; i < 12; i++)
  table.add(new tablerow(cells));
 tableadapter tableadapter = new tableadapter(this, table);
 lv.setadapter(tableadapter);
 lv.setonitemclicklistener(new itemclickevent());
 }
 class itemclickevent implements adapterview.onitemclicklistener {
 @override
 public void onitemclick(adapterview<?> arg0, view arg1, int arg2,
  long arg3) {
  toast.maketext(testmylistview.this, "选中第"+string.valueof(arg2)+"行", 500).show();
 }
 }
}

listview自适应实现table的类tableadapter.java代码如下:

此处需要注意:tablecell是格单元的类,tablerow是表格行的类,tablerowview是实现表格行的组件。实现步骤:tablecell --> tablerow(tablerowview)-->listview

package com.testmylistview;
import java.util.list;
import android.content.context;
import android.graphics.color;
import android.view.gravity;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseadapter;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;
public class tableadapter extends baseadapter {
 private context context;
 private list<tablerow> table;
 public tableadapter(context context, list<tablerow> table) {
 this.context = context;
 this.table = table;
 }
 @override
 public int getcount() {
 return table.size();
 }
 @override
 public long getitemid(int position) {
 return position;
 }
 public tablerow getitem(int position) {
 return table.get(position);
 }
 public view getview(int position, view convertview, viewgroup parent) {
 tablerow tablerow = table.get(position);
 return new tablerowview(this.context, tablerow);
 }
 /**
 * tablerowview 实现表格行的样式
 * @author hellogv
 */
 class tablerowview extends linearlayout {
 public tablerowview(context context, tablerow tablerow) {
  super(context);
  
  this.setorientation(linearlayout.horizontal);
  for (int i = 0; i < tablerow.getsize(); i++) {//逐个格单元添加到行
  tablecell tablecell = tablerow.getcellvalue(i);
  linearlayout.layoutparams layoutparams = new linearlayout.layoutparams(
   tablecell.width, tablecell.height);//按照格单元指定的大小设置空间
  layoutparams.setmargins(0, 0, 1, 1);//预留空隙制造边框
  if (tablecell.type == tablecell.string) {//如果格单元是文本内容
   textview textcell = new textview(context);
   textcell.setlines(1);
   textcell.setgravity(gravity.center);
   textcell.setbackgroundcolor(color.black);//背景黑色
   textcell.settext(string.valueof(tablecell.value));
   addview(textcell, layoutparams);
  } else if (tablecell.type == tablecell.image) {//如果格单元是图像内容
   imageview imgcell = new imageview(context);
   imgcell.setbackgroundcolor(color.black);//背景黑色
   imgcell.setimageresource((integer) tablecell.value);
   addview(imgcell, layoutparams);
  }
  }
  this.setbackgroundcolor(color.white);//背景白色,利用空隙来实现边框
 }
 }
 /**
 * tablerow 实现表格的行
 * @author hellogv
 */
 static public class tablerow {
 private tablecell[] cell;
 public tablerow(tablecell[] cell) {
  this.cell = cell;
 }
 public int getsize() {
  return cell.length;
 }
 public tablecell getcellvalue(int index) {
  if (index >= cell.length)
  return null;
  return cell[index];
 }
 }
 /**
 * tablecell 实现表格的格单元
 * @author hellogv
 */
 static public class tablecell {
 static public final int string = 0;
 static public final int image = 1;
 public object value;
 public int width;
 public int height;
 private int type;
 public tablecell(object value, int width, int height, int type) {
  this.value = value;
  this.width = width;
  this.height = height;
  this.type = type;
 }
 }
}

希望本文所述实例能够对大家进行android项目开发有所帮助。