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);
    }
}

實現起來比較簡單,主要代碼均已貼出,這裏代碼就不再上傳了,囉嗦了半天…希望對您能有所幫助。

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