效果图 :
分别是第一页、第二页、第三页,随手截的图,不整齐,勿见怪。开始走了弯路,废了不少时间。
思路如下:
1、用ViewPager实现左右分页滑动,布局最下面远点标记页码是根据有多个item动态添加的。
2、每个页面的GridView的item的个数根据屏幕的宽度高度来动态设置。
3、每个界面的GridView的adapter也是根据当前页面的itemCount来动态设置的。
主要代码:
package com.example.testview;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ViewPager_GV_ItemAdapter extends BaseAdapter {
private List<ChannelInfoBean> list_info;
private Context context;
/** ViewPager页码 */
private int index;
/** 根据屏幕大小计算得到的每页item个数 */
private int pageItemCount;
/** 传进来的List的总长度 */
private int totalSize;
/** 当前页item的实际个数 */
// private int itemRealNum;
@SuppressWarnings("unchecked")
public ViewPager_GV_ItemAdapter(Context context, List<?> list) {
this.context = context;
this.list_info = (List<ChannelInfoBean>) list;
}
public ViewPager_GV_ItemAdapter(Context context, List<?> list, int index, int pageItemCount) {
this.context = context;
this.index = index;
this.pageItemCount = pageItemCount;
list_info = new ArrayList<ChannelInfoBean>();
totalSize = list.size();
// itemRealNum=list.size()-index*pageItemCount;
// 当前页的item对应的实体在List<?>中的其实下标
int list_index = index * pageItemCount;
for (int i = list_index; i < list.size(); i++) {
list_info.add((ChannelInfoBean) list.get(i));
}
}
@Override
public int getCount() {
int size = totalSize / pageItemCount;
if (index == size)
return totalSize - pageItemCount * index;
else
return pageItemCount;
// return itemRealNum;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder iv;
if (convertView == null)
iv = new ViewHolder(context, R.layout.channel_gridview_item);
else
iv = (ViewHolder) convertView.getTag();
iv.updateViews(position, null);
return iv.mView;
}
class ViewHolder extends ChannelViewHolder {
ImageView iv_icon;
TextView tv_name;
public ViewHolder(Context context, int resource) {
super(context, resource);
}
@Override
protected void findViews() {
iv_icon = (ImageView) mView.findViewById(R.id.iv_gv_item_icon);
tv_name = (TextView) mView.findViewById(R.id.tv_gv_item_Name);
}
@Override
protected void updateViews(int position, Object inst) {
// 不管用
// iv_icon.setBackgroundResource(list_info.get(position).getIconID());
iv_icon.setImageResource(list_info.get(position).getIconID());
tv_name.setText(list_info.get(position).getName());
}
}
}
GridViewGallery:
package com.example.testview;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
*
* GridView滑动
*
* @author chenwansong
*
*/
public class GridViewGallery extends LinearLayout {
private Context context;
/** 保存实体对象链表 */
private List<ChannelInfoBean> list;
private ViewPager viewPager;
private LinearLayout ll_dot;
private ImageView[] dots;
/** ViewPager当前页 */
private int currentIndex;
/** ViewPager页数 */
private int viewPager_size;
/** 默认一页12个item */
private int pageItemCount = 12;
/** 保存每个页面的GridView视图 */
private List<View> list_Views;
public GridViewGallery(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
this.list = null;
initView();
}
@SuppressWarnings("unchecked")
public GridViewGallery(Context context, List<?> list) {
super(context);
this.context = context;
this.list = (List<ChannelInfoBean>) list;
initView();
initDots();
setAdapter();
}
private void setAdapter() {
list_Views = new ArrayList<View>();
for (int i = 0; i < viewPager_size; i++) {
list_Views.add(getViewPagerItem(i));
}
viewPager.setAdapter(new ViewPager_GridView_Adapter(list_Views));
}
private void initView() {
View view = LayoutInflater.from(context).inflate(R.layout.channel_activity, null);
viewPager = (ViewPager) view.findViewById(R.id.vPager);
ll_dot = (LinearLayout) view.findViewById(R.id.ll_channel_dots);
addView(view);
}
// 初始化底部小圆点
private void initDots() {
// 根据屏幕宽度高度计算pageItemCount
int width = Util.getWindowWidth(context);
int high = Util.getWindowHeight(context);
int col = (width / 160) > 2 ? (width / 160) : 3;
int row = (high / 200) > 4 ? (high / 200) : 4;
pageItemCount = col * row;
viewPager_size = list.size() / pageItemCount + 1;
if (0 < viewPager_size) {
ll_dot.removeAllViews();
if (1 == viewPager_size) {
ll_dot.setVisibility(View.GONE);
} else if (1 < viewPager_size) {
ll_dot.setVisibility(View.VISIBLE);
for (int j = 0; j < viewPager_size; j++) {
ImageView image = new ImageView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
params.setMargins(3, 0, 3, 0);
image.setBackgroundResource(R.drawable.channel_dot);
ll_dot.addView(image, params);
}
}
}
if (viewPager_size != 1) {
dots = new ImageView[viewPager_size];
for (int i = 0; i < viewPager_size; i++) {
dots[i] = (ImageView) ll_dot.getChildAt(i);
dots[i].setEnabled(true);
dots[i].setTag(i);
}
currentIndex = 0;
dots[currentIndex].setEnabled(false);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
setCurDot(arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
}
/** 当前底部小圆点 */
private void setCurDot(int positon) {
if (positon < 0 || positon > viewPager_size - 1 || currentIndex == positon) {
return;
}
dots[positon].setEnabled(false);
dots[currentIndex].setEnabled(true);
currentIndex = positon;
}
private View getViewPagerItem(int index) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.channel_viewpage_gridview, null);
GridView gridView = (GridView) layout.findViewById(R.id.vp_gv);
int width = Util.getWindowWidth(context);
int col = (width / 160) > 2 ? (width / 160) : 3;
gridView.setNumColumns(col);
ViewPager_GV_ItemAdapter adapter = new ViewPager_GV_ItemAdapter(context, list, index, pageItemCount);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (null != list.get(position + currentIndex * pageItemCount).getOnClickListener())
list.get(position + currentIndex * pageItemCount).getOnClickListener().ongvItemClickListener(view);
}
});
return gridView;
}
}
实体类(贴上来没啥用,主要是处理不同item的点击事件的时候,这么处理的:定义了一个点击的事件接口,实例化的时候实现这个item需要做的事情):
package com.example.testview;
import java.util.Collections;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.view.View;
public class ChannelInfoBean implements Comparable<ChannelInfoBean> {
private int id;
private String name;
private Drawable icon;
private String iconUrl;
private int iconID;
private String describtion;
private int type;
// 排序标记
private int order;
private onGridViewItemClickListener onClickListener;
public ChannelInfoBean(String name, int iconID, int order) {
super();
this.name = name;
this.iconID = iconID;
this.order = order;
}
public ChannelInfoBean(String name, int iconID, int order,onGridViewItemClickListener onClickListener) {
super();
this.name = name;
this.iconID = iconID;
this.order = order;
this.onClickListener=onClickListener;
}
public ChannelInfoBean(int id, String name, Drawable icon, String iconUrl, int iconID, int type, int order, String describtion) {
super();
this.id = id;
this.name = name;
this.icon = icon;
this.iconUrl = iconUrl;
this.iconID = iconID;
this.type = type;
this.order = order;
this.describtion = describtion;
}
public onGridViewItemClickListener getOnClickListener() {
return onClickListener;
}
public void setOnClickListener(onGridViewItemClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public String getIconUrl() {
return iconUrl;
}
public void setIconUrl(String iconUrl) {
this.iconUrl = iconUrl;
}
public int getIconID() {
return iconID;
}
public void setIconID(int iconID) {
this.iconID = iconID;
}
public String getIconurl() {
return iconUrl;
}
public void setIconurl(String iconurl) {
this.iconUrl = iconurl;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public String getDescribtion() {
return describtion;
}
public void setDescribtion(String describtion) {
this.describtion = describtion;
}
@Override
public int compareTo(ChannelInfoBean info) {
if (info != null) {
if (this.getOrder() > info.getOrder()) {
return 1;
} else {
return -1;
}
} else {
return 0;
}
}
//得到排序的List
public static List<ChannelInfoBean> getOrderList(List<ChannelInfoBean> list) {
Collections.sort(list);
return list;
}
public interface onGridViewItemClickListener
{
public abstract void ongvItemClickListener(View v);
}
}
把这几个自我感觉比较麻烦的类贴上来,有需要的可以看看。