效果图 :

                       

分别是第一页、第二页、第三页,随手截的图,不整齐,勿见怪。开始走了弯路,废了不少时间。

思路如下:

1、用ViewPager实现左右分页滑动,布局最下面远点标记页码是根据有多个item动态添加的。

2、每个页面的GridView的item的个数根据屏幕的宽度高度来动态设置。

3、每个界面的GridView的adapter也是根据当前页面的itemCount来动态设置的。

主要代码:

  1. package com.example.testview;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. public class ViewPager_GV_ItemAdapter extends BaseAdapter {
  11. private List<ChannelInfoBean> list_info;
  12. private Context context;
  13. /** ViewPager页码 */
  14. private int index;
  15. /** 根据屏幕大小计算得到的每页item个数 */
  16. private int pageItemCount;
  17. /** 传进来的List的总长度 */
  18. private int totalSize;
  19. /** 当前页item的实际个数 */
  20. // private int itemRealNum;
  21. @SuppressWarnings("unchecked")
  22. public ViewPager_GV_ItemAdapter(Context context, List<?> list) {
  23. this.context = context;
  24. this.list_info = (List<ChannelInfoBean>) list;
  25. }
  26. public ViewPager_GV_ItemAdapter(Context context, List<?> list, int index, int pageItemCount) {
  27. this.context = context;
  28. this.index = index;
  29. this.pageItemCount = pageItemCount;
  30. list_info = new ArrayList<ChannelInfoBean>();
  31. totalSize = list.size();
  32. // itemRealNum=list.size()-index*pageItemCount;
  33. // 当前页的item对应的实体在List<?>中的其实下标
  34. int list_index = index * pageItemCount;
  35. for (int i = list_index; i < list.size(); i++) {
  36. list_info.add((ChannelInfoBean) list.get(i));
  37. }
  38. }
  39. @Override
  40. public int getCount() {
  41. int size = totalSize / pageItemCount;
  42. if (index == size)
  43. return totalSize - pageItemCount * index;
  44. else
  45. return pageItemCount;
  46. // return itemRealNum;
  47. }
  48. @Override
  49. public Object getItem(int arg0) {
  50. return null;
  51. }
  52. @Override
  53. public long getItemId(int position) {
  54. return position;
  55. }
  56. @Override
  57. public View getView(int position, View convertView, ViewGroup parent) {
  58. ViewHolder iv;
  59. if (convertView == null)
  60. iv = new ViewHolder(context, R.layout.channel_gridview_item);
  61. else
  62. iv = (ViewHolder) convertView.getTag();
  63. iv.updateViews(position, null);
  64. return iv.mView;
  65. }
  66. class ViewHolder extends ChannelViewHolder {
  67. ImageView iv_icon;
  68. TextView tv_name;
  69. public ViewHolder(Context context, int resource) {
  70. super(context, resource);
  71. }
  72. @Override
  73. protected void findViews() {
  74. iv_icon = (ImageView) mView.findViewById(R.id.iv_gv_item_icon);
  75. tv_name = (TextView) mView.findViewById(R.id.tv_gv_item_Name);
  76. }
  77. @Override
  78. protected void updateViews(int position, Object inst) {
  79. // 不管用
  80. // iv_icon.setBackgroundResource(list_info.get(position).getIconID());
  81. iv_icon.setImageResource(list_info.get(position).getIconID());
  82. tv_name.setText(list_info.get(position).getName());
  83. }
  84. }
  85. }

GridViewGallery:

  1. package com.example.testview;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.support.v4.view.ViewPager;
  6. import android.util.AttributeSet;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.widget.AdapterView;
  10. import android.widget.AdapterView.OnItemClickListener;
  11. import android.widget.GridView;
  12. import android.widget.ImageView;
  13. import android.widget.LinearLayout;
  14. /**
  15. *
  16. * GridView滑动
  17. *
  18. * @author chenwansong
  19. *
  20. */
  21. public class GridViewGallery extends LinearLayout {
  22. private Context context;
  23. /** 保存实体对象链表 */
  24. private List<ChannelInfoBean> list;
  25. private ViewPager viewPager;
  26. private LinearLayout ll_dot;
  27. private ImageView[] dots;
  28. /** ViewPager当前页 */
  29. private int currentIndex;
  30. /** ViewPager页数 */
  31. private int viewPager_size;
  32. /** 默认一页12个item */
  33. private int pageItemCount = 12;
  34. /** 保存每个页面的GridView视图 */
  35. private List<View> list_Views;
  36. public GridViewGallery(Context context, AttributeSet attrs) {
  37. super(context, attrs);
  38. this.context = context;
  39. this.list = null;
  40. initView();
  41. }
  42. @SuppressWarnings("unchecked")
  43. public GridViewGallery(Context context, List<?> list) {
  44. super(context);
  45. this.context = context;
  46. this.list = (List<ChannelInfoBean>) list;
  47. initView();
  48. initDots();
  49. setAdapter();
  50. }
  51. private void setAdapter() {
  52. list_Views = new ArrayList<View>();
  53. for (int i = 0; i < viewPager_size; i++) {
  54. list_Views.add(getViewPagerItem(i));
  55. }
  56. viewPager.setAdapter(new ViewPager_GridView_Adapter(list_Views));
  57. }
  58. private void initView() {
  59. View view = LayoutInflater.from(context).inflate(R.layout.channel_activity, null);
  60. viewPager = (ViewPager) view.findViewById(R.id.vPager);
  61. ll_dot = (LinearLayout) view.findViewById(R.id.ll_channel_dots);
  62. addView(view);
  63. }
  64. // 初始化底部小圆点
  65. private void initDots() {
  66. // 根据屏幕宽度高度计算pageItemCount
  67. int width = Util.getWindowWidth(context);
  68. int high = Util.getWindowHeight(context);
  69. int col = (width / 160) > 2 ? (width / 160) : 3;
  70. int row = (high / 200) > 4 ? (high / 200) : 4;
  71. pageItemCount = col * row;
  72. viewPager_size = list.size() / pageItemCount + 1;
  73. if (0 < viewPager_size) {
  74. ll_dot.removeAllViews();
  75. if (1 == viewPager_size) {
  76. ll_dot.setVisibility(View.GONE);
  77. } else if (1 < viewPager_size) {
  78. ll_dot.setVisibility(View.VISIBLE);
  79. for (int j = 0; j < viewPager_size; j++) {
  80. ImageView image = new ImageView(context);
  81. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
  82. params.setMargins(3, 0, 3, 0);
  83. image.setBackgroundResource(R.drawable.channel_dot);
  84. ll_dot.addView(image, params);
  85. }
  86. }
  87. }
  88. if (viewPager_size != 1) {
  89. dots = new ImageView[viewPager_size];
  90. for (int i = 0; i < viewPager_size; i++) {
  91. dots[i] = (ImageView) ll_dot.getChildAt(i);
  92. dots[i].setEnabled(true);
  93. dots[i].setTag(i);
  94. }
  95. currentIndex = 0;
  96. dots[currentIndex].setEnabled(false);
  97. viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  98. @Override
  99. public void onPageSelected(int arg0) {
  100. setCurDot(arg0);
  101. }
  102. @Override
  103. public void onPageScrolled(int arg0, float arg1, int arg2) {
  104. // TODO Auto-generated method stub
  105. }
  106. @Override
  107. public void onPageScrollStateChanged(int arg0) {
  108. // TODO Auto-generated method stub
  109. }
  110. });
  111. }
  112. }
  113. /** 当前底部小圆点 */
  114. private void setCurDot(int positon) {
  115. if (positon < 0 || positon > viewPager_size - 1 || currentIndex == positon) {
  116. return;
  117. }
  118. dots[positon].setEnabled(false);
  119. dots[currentIndex].setEnabled(true);
  120. currentIndex = positon;
  121. }
  122. private View getViewPagerItem(int index) {
  123. LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  124. View layout = inflater.inflate(R.layout.channel_viewpage_gridview, null);
  125. GridView gridView = (GridView) layout.findViewById(R.id.vp_gv);
  126. int width = Util.getWindowWidth(context);
  127. int col = (width / 160) > 2 ? (width / 160) : 3;
  128. gridView.setNumColumns(col);
  129. ViewPager_GV_ItemAdapter adapter = new ViewPager_GV_ItemAdapter(context, list, index, pageItemCount);
  130. gridView.setAdapter(adapter);
  131. gridView.setOnItemClickListener(new OnItemClickListener() {
  132. @Override
  133. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  134. if (null != list.get(position + currentIndex * pageItemCount).getOnClickListener())
  135. list.get(position + currentIndex * pageItemCount).getOnClickListener().ongvItemClickListener(view);
  136. }
  137. });
  138. return gridView;
  139. }
  140. }

实体类(贴上来没啥用,主要是处理不同item的点击事件的时候,这么处理的:定义了一个点击的事件接口,实例化的时候实现这个item需要做的事情):

  1. package com.example.testview;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import android.graphics.drawable.Drawable;
  5. import android.view.View;
  6. public class ChannelInfoBean  implements Comparable<ChannelInfoBean> {
  7. private int id;
  8. private String name;
  9. private Drawable icon;
  10. private String iconUrl;
  11. private int iconID;
  12. private String describtion;
  13. private int type;
  14. // 排序标记
  15. private int order;
  16. private onGridViewItemClickListener onClickListener;
  17. public ChannelInfoBean(String name, int iconID, int order) {
  18. super();
  19. this.name = name;
  20. this.iconID = iconID;
  21. this.order = order;
  22. }
  23. public ChannelInfoBean(String name, int iconID, int order,onGridViewItemClickListener onClickListener) {
  24. super();
  25. this.name = name;
  26. this.iconID = iconID;
  27. this.order = order;
  28. this.onClickListener=onClickListener;
  29. }
  30. public ChannelInfoBean(int id, String name, Drawable icon, String iconUrl, int iconID, int type, int order, String describtion) {
  31. super();
  32. this.id = id;
  33. this.name = name;
  34. this.icon = icon;
  35. this.iconUrl = iconUrl;
  36. this.iconID = iconID;
  37. this.type = type;
  38. this.order = order;
  39. this.describtion = describtion;
  40. }
  41. public onGridViewItemClickListener getOnClickListener() {
  42. return onClickListener;
  43. }
  44. public void setOnClickListener(onGridViewItemClickListener onClickListener) {
  45. this.onClickListener = onClickListener;
  46. }
  47. public String getIconUrl() {
  48. return iconUrl;
  49. }
  50. public void setIconUrl(String iconUrl) {
  51. this.iconUrl = iconUrl;
  52. }
  53. public int getIconID() {
  54. return iconID;
  55. }
  56. public void setIconID(int iconID) {
  57. this.iconID = iconID;
  58. }
  59. public String getIconurl() {
  60. return iconUrl;
  61. }
  62. public void setIconurl(String iconurl) {
  63. this.iconUrl = iconurl;
  64. }
  65. public int getId() {
  66. return id;
  67. }
  68. public void setId(int id) {
  69. this.id = id;
  70. }
  71. public String getName() {
  72. return name;
  73. }
  74. public void setName(String name) {
  75. this.name = name;
  76. }
  77. public Drawable getIcon() {
  78. return icon;
  79. }
  80. public void setIcon(Drawable icon) {
  81. this.icon = icon;
  82. }
  83. public int getType() {
  84. return type;
  85. }
  86. public void setType(int type) {
  87. this.type = type;
  88. }
  89. public int getOrder() {
  90. return order;
  91. }
  92. public void setOrder(int order) {
  93. this.order = order;
  94. }
  95. public String getDescribtion() {
  96. return describtion;
  97. }
  98. public void setDescribtion(String describtion) {
  99. this.describtion = describtion;
  100. }
  101. @Override
  102. public int compareTo(ChannelInfoBean info) {
  103. if (info != null) {
  104. if (this.getOrder() > info.getOrder()) {
  105. return 1;
  106. } else {
  107. return -1;
  108. }
  109. } else {
  110. return 0;
  111. }
  112. }
  113. //得到排序的List
  114. public static List<ChannelInfoBean> getOrderList(List<ChannelInfoBean> list) {
  115. Collections.sort(list);
  116. return list;
  117. }
  118. public interface onGridViewItemClickListener
  119. {
  120. public abstract void ongvItemClickListener(View v);
  121. }
  122. }

把这几个自我感觉比较麻烦的类贴上来,有需要的可以看看。

android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)的更多相关文章

  1. 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题

    前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnb ...

  2. android ImageView网络图片加载、动态设置尺寸、圆角..

    封装了一个关于ImageView的辅助类,该类可以方便实现网络图片下载的同时,动态设置图片尺寸.圆角.....一系列连贯的操作,无样式表,java代码实现所有功能,使用很方便. package com ...

  3. android 颜色收集及部分gridview样式设置

    < ?xml version="1.0" encoding="utf-8" ?> < resources> < color nam ...

  4. Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性

    在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...

  5. Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解

    废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...

  6. Android中动态设置GridView的列数、列宽和行高

    在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的.但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量 ...

  7. Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。

    转载请注明出处:http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动态 ...

  8. android笔记:ViewPager实现界面的滑动

    最近在学习ViewPager实现界面的滑动,拜读了郭神的博客文章,并抽取归纳了自己对ViewPager的理解. ViewPager实现界面滑动的步骤如下: 1.在xml布局内加入控件android.s ...

  9. android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

随机推荐

  1. 各版本 linux(转)

    Linux各种版本下载 ftp://ftp.linuxforum.net/ISO/Redhat7.3/valhalla-i386-disc1.iso ftp://ftp.linuxforum.net/ ...

  2. iOS开发之info.pist文件和.pch文件

    iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...

  3. uvalive 5760 Alice and Bob (组合游戏,dp)

    题目链接: http://vjudge.net/problem/viewProblem.action?id=25636 对于>1的堆,必然会被其中一人全部合并. 然后就是二维dp,dp[非1堆的 ...

  4. Hibernate的CRUD

    1.CRUD: C:sesion.save() R:session.get()? session.load() D:session.delete() U:session.update() 2.读取数据 ...

  5. 广东移动NGBOSS系统话费查询

    基于很多客户的需要 现承接广东移动NGBOSS华为系统的各项功能开发 承接广东深圳.佛山.东莞.广州.惠州.汕头.湛江移动NGBOSS的全球通开户,批量话费查询.缴费,号码导出等功能开发. 有需要者联 ...

  6. html中插入flash代码详解(转载)

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  7. 人见人爱a*b 杭电2035

    求A^B的最后三位数表示的整数.说明:A^B的含义是“A的B次方”   Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A= ...

  8. JS之路——日期函数

    时间对象是一个我们经常要用到的对象,无论是做时间输出.时间判断等操作时都与这个对象离不开.除开JavaScript中的时间对象外,在VbScript中也有许多的时间对象,而且非常好用.下面还是按照我们 ...

  9. Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)

    Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...

  10. Android-RecyclerView-Item点击事件设置

    在上一篇博客Android-RecylerView初识中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件 ...