«

GridView每行显示不同列数效果模拟

时间:2024-3-2 19:26     作者:韩俊     分类: Android


最近在用支付宝的app,觉得其界面中主页挺有意思,也想写出这种效果。因为GridView每行列数固定,查了很久也没有找到相应的解决方法。为了也达到这种效果,就先在ListView中每个item设为一个GridView,以多布局的形式模拟这种效果。


首先是listview的adapter

public class MyAdapter extends BaseAdapter {

    private Context context;
    private int size;
    private int select;
    private int screenwidth;
    private int width;
    private List<String> list = null;

    private ArrayList<String> mlist = new ArrayList<String>();
    private ArrayList<View> views;

    public MyAdapter(Context context, int size, int select, int screenwidth,
            int width, List<String> list) {
        super();
        this.context = context;
        this.size = size;
        this.select = select;
        this.screenwidth = screenwidth;
        this.width = width;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return size;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        if (select == position) {
            return 0;
        }
        return 1;
    }
    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return 2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewholder = null;
        if (convertView == null) {
            viewholder = new ViewHolder();
            if(position == select){
                convertView = LayoutInflater.from(context).inflate(
                        R.layout.vp, null); 
                viewholder.vp = (ViewPager) convertView.findViewById(R.id.vp);
            }else{
                convertView = LayoutInflater.from(context).inflate(
                        R.layout.lv_item, null);
                viewholder.gv = (GridView) convertView.findViewById(R.id.gv);
            }
            convertView.setTag(viewholder);
        } else {
            viewholder = (ViewHolder) convertView.getTag();
        }
        if(position == select){
            views = new ArrayList<View>();
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            views.add(inflater.inflate(R.layout.page1, null));
            views.add(inflater.inflate(R.layout.page2, null));

            viewholder.vp.setAdapter(new MyViewPager(views));
        }else{
            mlist = new ArrayList<String>();
            int lnum;
            if (position < select) {
                lnum = position * 4;
            } else {
                lnum = (position - 1) * 4;
            }
            for (int i = lnum; i < lnum + 4; i++) {
                mlist.add(list.get(i));
            }
            MyGridAdapter adapter = new MyGridAdapter(context, width, mlist);
            viewholder.gv.setAdapter(adapter);
        }

        return convertView;
    }

    final static class ViewHolder {
        GridView gv;
        ViewPager vp;
    }

    class MyViewPager extends PagerAdapter {
        public ArrayList<View> list;

        public MyViewPager(ArrayList<View> list) {
            this.list = list;
        }

        @Override
        public int getCount() {

            return list.size();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(list.get(position), 0);

            return list.get(position);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(list.get(position));
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

    }

}
其中下面是分别确定布局类型及布局数量的
@Override
    public int getItemViewType(int position) {
        if (select == position) {
            return 0;
        }
        return 1;
    }
    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return 2;
    }

还要对viewpager根据你确定的那行进行判别

if(position == select){
        <span style="white-space:pre">  </span>views = new ArrayList<View>();
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            views.add(inflater.inflate(R.layout.page1, null));
            views.add(inflater.inflate(R.layout.page2, null));

            viewholder.vp.setAdapter(new MyViewPager(views));
        }




然后是GridView的适配器

public class MyGridAdapter extends BaseAdapter {

private Context context;
private int width;
private List&lt;String&gt; list = null;

public MyGridAdapter(Context context, int width, List&lt;String&gt; list) {
    super();
    this.context = context;
    this.width = width;
    this.list = list;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewholder = null;
    if (convertView == null) {
        viewholder = new ViewHolder();
        convertView = LayoutInflater.from(context).inflate(
                R.layout.gv_item, null);
        viewholder.tv = (TextView) convertView.findViewById(R.id.tv);
        convertView.setTag(viewholder);
    } else {
        viewholder = (ViewHolder) convertView.getTag();
    }

    LinearLayout.LayoutParams mLinearparams = (LayoutParams) viewholder.tv
            .getLayoutParams();
    mLinearparams.width = width;
    mLinearparams.height = width;
    viewholder.tv.setLayoutParams(mLinearparams);

    viewholder.tv.setText(list.get(position));

    return convertView;
}

final static class ViewHolder {
    TextView tv;
}

}



DEMO


        <p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>

标签: android

热门推荐