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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章