天天看點

ListView嵌套GridView的Demo

需要自定義GridView,重寫onMeasure方法

package com.administrator.jizhangben;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

/**
 * Created by Administrator on 2016/3/25.
 */
public class MyGridView extends GridView{

    public MyGridView(Context context) {
        super(context);
    }

    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}
           

主界面代碼:

package com.administrator.jizhangben;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import com.administrator.jizhangben.adapter.WeekLvAdapter;
import com.administrator.jizhangben.bean.Week;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv_week;
    private WeekLvAdapter wla;
    private List<Week> lvList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_week = (ListView)this.findViewById(R.id.lv_week);
        lvList = new ArrayList<>();
        setData();
        wla = new WeekLvAdapter(this, lvList);
        lv_week.setAdapter(wla);
    }

    /**
     * 設定資料源
     */
    private void setData() {
        for (int i=0;i<10;i++){
            List<String> gvList = new ArrayList<>();
            for (int j=0;j<10;j++){
                gvList.add(j + "");
            }
            Week week = new Week();
            week.setTop("第" + i + "個");
            week.setWeeks(gvList);
            lvList.add(week);
        }
    }
}
           

ListView擴充卡代碼:

package com.administrator.jizhangben.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.administrator.jizhangben.MyGridView;
import com.administrator.jizhangben.R;
import com.administrator.jizhangben.bean.Week;

import java.util.List;

/**
 * Created by Administrator on 2016/3/25.
 */
public class WeekLvAdapter extends BaseAdapter{

    private List<Week> lvList;

    private LayoutInflater lif;

    private WeekGvAdapter wga;

    private Context context;

    public WeekLvAdapter(Context context, List<Week> lvList) {
        super();
        this.lvList = lvList;
        this.context = context;
        lif = LayoutInflater.from(context);
    }

    /**
     * 計算ListVeiw裡面的資料長度
     */
    @Override
    public int getCount() {
        return lvList==null?0:lvList.size();
    }

    /**
     * 根據下标傳回下标對應的data資料的對象
     */
    @Override
    public Object getItem(int position) {
        return lvList==null?null:lvList.get(position);
    }

    /**
     * 傳回下标
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 傳回視圖
     * 參數1:指資料在ListView裡面的下标
     * 參數2:ListVewi上面顯示控件對象
     * 參數3:控件的父布局
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = lif.inflate(R.layout.week_item,null);
            vh.gv = (MyGridView)convertView.findViewById(R.id.gv_week);
            vh.tv = (TextView)convertView.findViewById(R.id.tv_top);
            convertView.setTag(vh);
        }else {
            vh = (ViewHolder) convertView.getTag();
        }
        //設定GridView
        wga = new WeekGvAdapter(context,lvList.get(position).getWeeks());
        vh.gv.setAdapter(wga);
        //GridView點選事件
        vh.gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, longid) {
                Toast.makeText(context, position+1+"", Toast.LENGTH_SHORT).show();
            }
        });
        //設定文本
        vh.tv.setText(lvList.get(position).getTop());

        return convertView;
    }

    static class ViewHolder{
        MyGridView gv;
        TextView tv;
    }

}
           

GridView擴充卡代碼:

package com.administrator.jizhangben.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.administrator.jizhangben.R;

import java.util.List;

/**
 * Created by Administrator on 2016/3/25.
 */
public class WeekGvAdapter extends BaseAdapter{
    private List<String> gvList;

    private LayoutInflater lif;

    public WeekGvAdapter(Context context,List<String> gvList) {
        super();
        this.gvList = gvList;
        lif = LayoutInflater.from(context);
    }

    /**
     * 計算ListVeiw裡面的資料長度
     */
    @Override
    public int getCount() {
        return gvList==null?0:gvList.size();
    }

    /**
     * 根據下标傳回下标對應的data資料的對象
     */
    @Override
    public Object getItem(int position) {
        return gvList==null?null:gvList.get(position);
    }

    /**
     * 傳回下标
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 傳回視圖
     * 參數1:指資料在ListView裡面的下标
     * 參數2:ListVewi上面顯示控件對象
     * 參數3:控件的父布局
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = lif.inflate(R.layout.week_item_item,null);
            vh.tv = (TextView)convertView.findViewById(R.id.tv_item);
            convertView.setTag(vh);
        }else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.tv.setText(gvList.get(position));
        return convertView;
    }

    static class ViewHolder{
        TextView tv;
    }
}
           

bean類代碼:

package com.administrator.jizhangben.bean;

import java.util.List;

/**
 * Created by Administrator on 2016/3/25.
 */
public class Week {
    private String top;

    private List<String> weeks;

    public List<String> getWeeks() {
        return weeks;
    }

    public void setWeeks(List<String> weeks) {
        this.weeks = weeks;
    }

    public String getTop() {

        return top;
    }

    public void setTop(String top) {
        this.top = top;
    }
}
           

繼續閱讀