android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)
效果图 :

分别是第一页、第二页、第三页,随手截的图,不整齐,勿见怪。开始走了弯路,废了不少时间。
思路如下:
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);
- }
- }
把这几个自我感觉比较麻烦的类贴上来,有需要的可以看看。
android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)的更多相关文章
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnb ...
- android ImageView网络图片加载、动态设置尺寸、圆角..
封装了一个关于ImageView的辅助类,该类可以方便实现网络图片下载的同时,动态设置图片尺寸.圆角.....一系列连贯的操作,无样式表,java代码实现所有功能,使用很方便. package com ...
- android 颜色收集及部分gridview样式设置
< ?xml version="1.0" encoding="utf-8" ?> < resources> < color nam ...
- Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...
- Android中动态设置GridView的列数、列宽和行高
在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的.但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量 ...
- Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。
转载请注明出处:http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动态 ...
- android笔记:ViewPager实现界面的滑动
最近在学习ViewPager实现界面的滑动,拜读了郭神的博客文章,并抽取归纳了自己对ViewPager的理解. ViewPager实现界面滑动的步骤如下: 1.在xml布局内加入控件android.s ...
- android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高
1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...
随机推荐
- 跟我学android-android常用布局介绍
在上一章我们曾经谈到,Android平台的界面 是使用XML的方式设计的,然后在上一章我们只做了一个简单的界面,在这章,我们将介绍如何使用常用的控件设计实用的界面. Android中的视图都是继承Vi ...
- TalkingData Cocos2dx在android平台使用总结
前言:最近发现很多朋友在使用TalkingData游戏版本Cocos2dx SDK使用过程中会出现的一些问题,今天来做一下总结,希望对您有所帮助: 首先非常感谢您使用TalkingData游戏统计平台 ...
- gearmand的安装
1.安装gperf libuuid-devel yum install -y gperf libuuid-devel 2.安装 libevent yum install libevent libeve ...
- 16 3Sum Closest(输出距离target最近的三个数的和Medium)
题目意思:给一个数组,给一个target,找三个数的和,这个和要与target距离最近,输出这个和 思路:这个题比3sum要稍微简单一点,如果需要优化,也可以去重,不过因为结果唯一,我没有去重. mi ...
- python numpy 使用笔记 矩阵操作
(原创文章转载请标注来源) 在学习机器学习的过程中经常会用到矩阵,那么使用numpy扩展包将是不二的选择 建议在平Python中用多维数组(array)代替矩阵(matrix) 入门请考 http:/ ...
- Android模拟器Genymotion安装向导
Genymotion简述 Genymotion提供Android虚拟环境的工具集.相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了.如果你没有物理机器,又不想忍受官方模拟 ...
- Java笔记-快速失败and安全失败
参考资料:http://blog.csdn.net/chenssy/article/details/38151189 快速失败 fail-fast 安全失败 fail-safe java.util包下 ...
- TableView_编辑 实例代码
@interface MJViewController () <UITableViewDataSource, UITableViewDelegate> { NSMutableArray * ...
- Gradle sync failed: Gradle version 2.2 is required. Current version is 2.10.
Gradle sync failed: Gradle version 2.2 is required. Current version is 2.10. If using the gradle wra ...
- 调用系统API还是很高效的,不必担心性能
代码如下: void MainWindow::on_pushButton_2_clicked() { QTime total; total.start(); ; ; i<=*; i++) { Q ...