Android为我们提供了竖直方向的滚动控件GridView,但如果我们想让它水平滚动起来,就需要自己实现了。

以下使用的测试数据datas集合都为List<ResolveInfo>类型,用来存储手机中的所有App
public static List<ResolveInfo> getAppData(Context context) {
PackageManager packageManager = context.getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
return packageManager.queryIntentActivities(mainIntent, 0);
}
一、单行横向显示
实现思路
具体实现
关键代码
/**
* 将GridView改成单行横向布局
*/
private void changeGridView() {
// item宽度
int itemWidth = DensityUtil.dip2px(this, 100);
// item之间的间隔
int itemPaddingH = DensityUtil.dip2px(this, 1);
int size = datas.size();
// 计算GridView宽度
int gridviewWidth = size * (itemWidth + itemPaddingH);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
gridviewWidth, LinearLayout.LayoutParams.MATCH_PARENT);
mContentGv.setLayoutParams(params);
mContentGv.setColumnWidth(itemWidth);
mContentGv.setHorizontalSpacing(itemPaddingH);
mContentGv.setStretchMode(GridView.NO_STRETCH);
mContentGv.setNumColumns(size);
}
这里用到的dip2px方法是根据手机的分辨率从 dp 的单位 转成为 px(像素)
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
* @param context 上下文
* @param dpValue dp值
* @return px值
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
在布局文件中,使用HorizontalScrollView包裹GridView
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<GridView
android:id="@+id/gv_horizontal_gridview_line"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"/>
</LinearLayout>
</HorizontalScrollView>
通过以上设置,再加上Adapter适配器就能实现单行横向滚动了,适配器使用常规的实现方式就行,这里就不贴了
二、多行横向分页显示
实现思路
具体实现
数据量很多时,需要进行分页,计算方式
需要页数 = 总数量 ÷ 每页显示数量
有些整除不了的,就需要使用Math.ceil()函数,向上取整
关键代码
/**
* 获取系统所有的应用程序,根据每页需要显示的item数量,生成相应数量的GridView页面
*/
private void initViews(List<ResolveInfo> datas) {
int dataSize = datas.size();
// (需要页数 = 总数量 ÷ 每页显示数量)向上取整数
int PageCount = (int) Math.ceil(dataSize / APP_SIZE);
mGridViewList = new ArrayList<>();
for (int i = 0; i <= PageCount; i++) {
GridView appPage = new GridView(this);
appPage.setAdapter(new HorizontalGvAdapter(this, datas, i));
appPage.setNumColumns(4);
appPage.setVerticalSpacing(1);
appPage.setHorizontalSpacing(1);
appPage.setHorizontalScrollBarEnabled(false);
appPage.setVerticalScrollBarEnabled(false);
mGridViewList.add(appPage);
}
if(dataSize % APP_SIZE == 0){
mGridViewList.remove(mGridViewList.size()-1);
PageCount--;
}
mGvPagerAdapter = new HorizontalGvPagerAdapter(mGridViewList);
viewPager.setAdapter(mGvPagerAdapter);
viewPager.addOnPageChangeListener(new MyPageChangeListener());
addDot(PageCount);
}
当总数量 ÷ 每页显示数量刚好被整除时,会出现一页空白页的情况,这个时候需要去掉多出来的那一页
if(dataSize % APP_SIZE == 0){
mGridViewList.remove(mGridViewList.size()-1);
PageCount--;
}
Adapter在创建初期就要对显示的数据进行控制,因为这里每个GridView都有一个单独的Adapter,所以需要对其显示的datas进行动态计算
通过传入构造方法的数据进行动态计算,可以得出数据开始加载的位置、结束加载的位置
HorizontalGvAdapter的构造方法:
/**
* 所有应用数据
*/
private List<ResolveInfo> mAppDatas = new ArrayList<ResolveInfo>();
public HorizontalGvAdapter(Context context, List<ResolveInfo> list, int page) {
this.mContext = context;
// 开始加载的位置
int pageStart = page * HorizontalGridViewAct.APP_SIZE;
// 结束加载的位置
int pageEnd = pageStart + HorizontalGridViewAct.APP_SIZE;
while ((pageStart < list.size()) && (pageStart < pageEnd)) {
mAppDatas.add(list.get(pageStart));
pageStart++;
}
}
如果需要加小圆点的话,可以先在布局中用一个空LinearLayout当小圆点的容器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/vp_horizontal_gridview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:background="#c5c5c5"
android:scaleType="fitXY"/>
<!-- 底部小圆点 -->
<LinearLayout
android:id="@+id/ll_dot_container"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#4b4b4b"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="horizontal"/>
</LinearLayout>
然后在代码中用List<View>来保存创建的小圆点
// 放圆点的list
private List<View> dotViewsList;
/**
* 创建指定数量的圆点
* @param dotNumber viewPager的数量
*/
private void addDot(int dotNumber) {
if (null == dotViewsList) {
dotViewsList = new ArrayList<View>();
}
LinearLayout dotLayout = (LinearLayout) findViewById(R.id.ll_dot_container);
for (int i = 0; i <= dotNumber; i++) {
ImageView dotView = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
// 圆点与圆点之间的距离
params.leftMargin = 10;
params.rightMargin = 10;
// 圆点的大小
params.height = 15;
params.width = 15;
dotLayout.addView(dotView, params);
dotViewsList.add(dotView);
}
// 设置圆点默认选中第一个
setDotShow(0);
}
动态添加完小圆点后,就可以设置它们的选中状态了,这里只需要更改对应小圆点的图片显示就行
/**
* 显示底部圆点导航
* @param position 选中哪个圆点
*/
private void setDotShow(int position){
if (dotViewsList == null){
return;
}
for (int i = 0; i < dotViewsList.size(); i++) {
if (i == position) {
dotViewsList.get(position).setBackgroundResource(R.drawable.ic_dot_on);
} else {
dotViewsList.get(i).setBackgroundResource(R.drawable.ic_dot_off);
}
}
}
三、总结
以上就是让GridView横向滚动的实现方式,其实我们完全可以不必这么麻烦,Google在support-v7包中为我们提供了RecyclerView控件,切换横向和竖直滚动只需要让布局管理器使用setOrientation方法设置一下就好,非常便捷,如果项目允许,建议使用RecyclerView来实现此类需求。
希望对大家的学习有所帮助,也希望大家多多支持。
# gridview横向水平滚动
# gridview横向滚动
# gridview
# 横向滚动条
# android开发之横向滚动/竖向滚动的ListView(固定列头)
# Android程序开发之ListView实现横向滚动(带表头与固定列)
# Android使用GridView实现横向滚动效果
# Android开发实现横向列表GridView横向滚动的方法【附源码下载】
# Android GridView实现横向列表水平滚动
# Android自定义ViewGroup实现可滚动的横向布局(2)
# Android实现自定义的弹幕效果
# 实例解析如何在Android应用中实现弹幕动画效果
# Android 实现仿网络直播弹幕功能详解及实例
# Android实现横向无限循环滚动的单行弹幕效果
# 圆点
# 每页
# 小圆点
# 加载
# 就行
# 分页
# 转成
# 都有
# 第一个
# 就能
# 多个
# 就不
# 就好
# 只需
# 再加上
# 对其
# 此类
# 这个时候
# 使其
# 要让
相关文章:
建站168自助建站系统:快速模板定制与SEO优化指南
如何在建站主机中优化服务器配置?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
网站企业制作流程,用什么语言做企业网站比较好?
,交易猫的商品怎么发布到网站上去?
内网网站制作软件,内网的网站如何发布到外网?
如何通过西部数码建站助手快速创建专业网站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
制作销售网站教学视频,销售网站有哪些?
济南网站制作的价格,历城一职专官方网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
IOS倒计时设置UIButton标题title的抖动问题
如何在宝塔面板中修改默认建站目录?
制作电商网页,电商供应链怎么做?
如何在Golang中指定模块版本_使用go.mod控制版本号
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何快速生成高效建站系统源代码?
建站之星如何实现网站加密操作?
建站之星代理平台如何选择最佳方案?
如何在VPS电脑上快速搭建网站?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
建站之星伪静态规则如何设置?
如何选择最佳自助建站系统?快速指南解析优劣
如何配置FTP站点权限与安全设置?
已有域名和空间,如何快速搭建网站?
教学网站制作软件,学习*后期制作的网站有哪些?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何快速搭建高效可靠的建站解决方案?
公司门户网站制作流程,华为官网怎么做?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何在IIS服务器上快速部署高效网站?
个人网站制作流程图片大全,个人网站如何注销?
建站主机SSH密钥生成步骤及常见问题解答?
网站设计制作企业有哪些,抖音官网主页怎么设置?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
简单实现Android验证码
网站设计制作公司地址,网站建设比较好的公司都有哪些?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
香港网站服务器数量如何影响SEO优化效果?
建站之星如何快速更换网站模板?
,在苏州找工作,上哪个网站比较好?
代刷网站制作软件,别人代刷火车票靠谱吗?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何用虚拟主机快速搭建网站?详细步骤解析
深圳网站制作案例,网页的相关名词有哪些?
建站主机是什么?如何选择适合的建站主机?
如何通过VPS建站实现广告与增值服务盈利?
*请认真填写需求信息,我们会在24小时内与您取得联系。