效果图 :

                       

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

思路如下:

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. SQL后台分页三种方案和分析

    建立表:CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) CO ...

  2. Objective-C学习篇05—Foundation框架简介

    iOS中所谓的框架,说到底就是一个目录,iOS提供了很多我们可以在应用程序中调用的框架.许多应用程序都使用了如Foundation.UIKit和Core Graphics这些框架.根据你为应用程序选择 ...

  3. AutoIt3初探(1)

    AutoIt3可实现系统操作,键盘鼠标模拟,是自动化测试的一个好工具. 这个是在线帮助文档,http://www.jb51.net/shouce/autoit/ 需要先下载一个autoIt安装,然后将 ...

  4. [jQuery编程挑战]003 克隆一个页面元素及其相关事件

    挑战: a) 绑定一个点击方法到这个div,点击后此元素会淡出消失 b) 同时克隆一个新的div元素到页面,元素内容是前面div文字内容反向书写(即,sgatbg olleh),同样也具有上面的点击事 ...

  5. Eclipse 将Java项目转为Dynamic web project

    1.打开项目根目次下的.project 在<buildSpec>节点下是否存在 <buildCommand> <name>org.eclipse.wst.commo ...

  6. C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  7. iOS常用动画-b

    CoreAnimationEffect.h //  CoreAnimationEffect // //  Created by VincentXue on 13-1-19. //  Copyright ...

  8. MATLAB文件操作及读txt文件

    转自:http://blog.csdn.net/vblittleboy/article/details/8049748 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MA ...

  9. No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'

    运行代码是出现了这个错误,No Entity Framework provider found for the ADO.NET provider with invariant name 'System ...

  10. 解决mongodb ISODate相差8小时问题

    服务端使用mongoose操作mongodb,其中Schema中的日期字段定义如下: date: {type:Date, default:Date.now},//操作日期 插入到mongodb中adt ...