ListView+GridView实现行列不确定的表格

来源:互联网 发布:golang mongodb 查询 编辑:程序博客网 时间:2024/05/19 18:14

请尊重个人劳动成果,转载注明出处,谢谢!
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);    }}

实现起来比较简单,主要代码均已贴出,这里代码就不再上传了,啰嗦了半天…希望对您能有所帮助。

1 0