可以折叠Gridview

2024-09-04 01:48
文章标签 gridview 折叠

本文主要是介绍可以折叠Gridview,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可以折叠Gridview

ezgif

实现原理

1、折叠实现

重写gridview的setAdapter方法

    @Override
public void setAdapter(ListAdapter adapter) {if (foldNm > 0) {//进行折叠adapter = new FoldViewGridAdapter(adapter, foldNm);}super.setAdapter(adapter);}

FoldViewGridAdapter是一个包装类,用来实现对当前的adapter包装,主要是重写getCount方法如下:

private class FoldViewGridAdapter implements WrapperListAdapter {...@Overridepublic int getCount() {//fn如果小于1,不进行折叠,根据是否折叠来判断,默认是折叠状态if (fn < 0) {return adapter.getCount();} else {//如果fn大于0,进行折叠处理if (expend) {return adapter.getCount();} else {return Math.min(adapter.getCount(), fn * getNumColumns());}}}@Overridepublic ListAdapter getWrappedAdapter() {return this;}...
}

先判断fn,也就是折叠后显示的行数,fn初始值为-1,也就是不折叠,当设置了fn值大于0,那么就需要进行折叠判断,如果需要折叠,则返回

 return Math.min(adapter.getCount(), fn * getNumColumns());

两者中的最小值。fn * getNumColumns()是折叠时显示的行数和显示的列数的积,也就是显示的个数。

2、如何添加ExpendControlView

同样在重写setAdapter方法,对adapter进行再次封装。

HeaderViewGridAdapter headerViewGridAdapter = new HeaderViewGridAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);

添加ExpendControlView的逻辑主要在HeaderViewGridAdapter中,HeaderViewGrideAdapter要实现一下几点:

1、怎么使添加的ExpendControlView,独占一行。
    public void addExpendControlView(View v, Object data, boolean isSelectable, boolean isExpendControlView) {ViewGroup.LayoutParams lyp = v.getLayoutParams();FixedViewInfo info = new FixedViewInfo();FrameLayout fl = new FullWidthFixedViewLayout(getContext());if (lyp != null) {v.setLayoutParams(new FrameLayout.LayoutParams(lyp.width, lyp.height));fl.setLayoutParams(new LayoutParams(lyp.width, lyp.height));}fl.addView(v);info.view = v;info.viewContainer = fl;info.data = data;info.isSelectable = isSelectable;//控制是否可以折叠info.isExpendControlView = isExpendControlView;mFooterViewInfos.add(info);if (mAdapter != null) {((HeaderViewGridAdapter) mAdapter).notifyDataSetChanged();}}

在addExpendControlView方法中,会先创建一个fl的viewGroup,然后再把controlview添加到fl中,FullWidthFixedViewLayout的代码如下:

    private class FullWidthFixedViewLayout extends FrameLayout {public FullWidthFixedViewLayout(Context context) {super(context);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {int realLeft = GridViewEnableFooter.this.getPaddingLeft() + getPaddingLeft();// Try to make where it should be, from left, full widthif (realLeft != left) {offsetLeftAndRight(realLeft - left);}super.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int targetWidth = GridViewEnableFooter.this.getMeasuredWidth()- GridViewEnableFooter.this.getPaddingLeft()- GridViewEnableFooter.this.getPaddingRight();widthMeasureSpec = MeasureSpec.makeMeasureSpec(targetWidth,MeasureSpec.getMode(widthMeasureSpec));super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}

在onLayout和onMeasure的时候设置宽度和gridview的宽度一致,来设置fl的宽度和gridview的宽度一致,这样可以独占一行。

2、添加ExpendControlView后count的计算。

添加ExpendControlView需要重新计算adapter的getcount返回值,getCount方法如下:

        public int getCount() {return getExpendControlViewsCount() * mNumColumns + getAdapterAndPlaceHolderCount();}

因为一个ExpendControlView会占一行,所以需要乘以列数,getAdapterAndPlaceHolderCount方法实现如下:

        private int getAdapterAndPlaceHolderCount() {return (int) (Math.ceil(1f * mAdapter.getCount() / mNumColumns) * mNumColumns);}

getAdapterAndPlaceHolderCount用来补充数量,使得count个数为整数列的倍数。如果不是整数列,那么添加的ExpendControlView不会占用单独的行,显示有问题。

3、重写getView方法。

添加的ExpendControlView需要在getView中进行返回,所以还需要重写getView方法。

public View getView(int position, View convertView, ViewGroup parent) {// Adapterfinal int adjPosition = position - numHeadersAndPlaceholders;int adapterCount = 0;if (mAdapter != null) {adapterCount = getAdapterAndPlaceHolderCount();if (adjPosition < adapterCount) {if (adjPosition < mAdapter.getCount()) {return mAdapter.getView(adjPosition, convertView, parent);} else {if (convertView == null) {convertView = new View(parent.getContext());}convertView.setVisibility(View.INVISIBLE);convertView.setMinimumHeight(mRowHeight);return convertView;}}}// ExpendControlViewfinal int footerPosition = adjPosition - adapterCount;if (footerPosition < getCount()) {View footViewContainer = mFooterViewInfos.get(footerPosition / mNumColumns).viewContainer;if (position % mNumColumns == 0) {return footViewContainer;} else {if (convertView == null) {convertView = new View(parent.getContext());}// We need to do this because GridView uses the height of the last item// in a row to determine the height for the entire row.convertView.setVisibility(View.INVISIBLE);convertView.setMinimumHeight(footViewContainer.getHeight());return convertView;}}throw new ArrayIndexOutOfBoundsException(position);}

方法

1、添加底部控制view

public void addExpendControlView(View view)

2、设置折叠时展示的行数

setFoldNum(int foldNm)

用于设置折叠时显示的行数

使用方法

//折叠控制view
gridView.addFooterView(LoadMoreView(this))//设置折叠行数
gridView.setFoldNum(2)gridView.adapter = object : BaseAdapter() {...}

上面的loadMoreView就是底部的折叠控制view,添加自己的控制view时,继承下面接口

interface IExpendControl {/*** 展开*/fun expend()/*** 折叠*/fun fold()
}

重写expend和fold方法,也就是展开和折叠,完成控制。

class LoadMoreView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null
) : ConstraintLayout(context, attrs), IExpendControl {private var viewBinding: LoadMoreViewBinding =LoadMoreViewBinding.inflate(LayoutInflater.from(context), this)override fun expend() {//展开时操作viewBinding.loadMore.text = "收起"viewBinding.arrow.setImageResource(R.drawable.up_arrow)}override fun fold() {//折叠时操作viewBinding.loadMore.text = "展开全部"viewBinding.arrow.setImageResource(R.drawable.down_arrow)}
}

源码地址

https://github.com/hankinghu/ExpendGridView

参考

https://github.com/liaohuqiu/android-GridViewWithHeaderAndFooter

这篇关于可以折叠Gridview的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134657

相关文章

asp.net 中GridView的使用方法

可以看看,学习学习 https://blog.csdn.net/zou15093087438/article/details/79637042

C++基础:折叠表达式(C++17)

C++基础:折叠表达式(C++17) 简介语法展开 示例 简介 C++17 引入了一种新的语法特性,叫做折叠表达式,它允许编译器在模板参数包展开时进行元编程操作。折叠表达式的引入极大地简化了元编程代码,使其变得更为直观和简介。 语法 折叠表达式,简单来说,就是以二元运算符对形参包进行折叠,总共有以下四种类型: 一元右折叠一元左折叠二元右折叠二元左折叠 其对应的语法如下:

Android Studio任意位置折叠代码

在Android Studio中 方法块、import区、{ }大括号块 都会有自动 代码折叠的 +号按钮, 这有利于开发者只关注核心逻辑,提高开发效率。          但有时我们希望其它区域也能使用折叠功能,比如 ButterKnife的BindView区,有时十多个BindView能占用一两屏,这么多自动绑定view的代码对我关注一个Activity的核心确实没有多大作

Android 横向列表GridView 实现横向滚动

Android 横向列表实现,可左右滑动,如下图   1.主界面布局代码:activity_main.xml a.包裹HorizontalScrollView控件是GirdView横向滚动的基本条件b.GirdView外包裹LinearLayout是java代码中参数设置的必要条件 <?xml version="1.0" encoding="utf-8"?><Line

GridView生成的HTML代码

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" CssClass="tablecss">         <Columns>             <asp:TemplateField HeaderText="编号" HeaderStyle-CssClass="aaa" ItemSty

Flutter——最详细(GridView)使用教程

GridView简介: 项目地址 可以创建网格列表视图;主要通过Count、extent、custom、builder构造列表。有内边距、是否反向、滑动控制器等属性。 四个属性使用场景,Count、extent、custom适用于子布局较少时使用。可能会用到上拉刷新,数据较多时,则使用builder属性。 使用场景: 列如:支付宝首页的网格布局,等一系列网格样式的UI

android gridview 停止滚动

http://blog.csdn.net/yaphetzhao/article/details/50544105 参考上面的博客,关键代码我就贴出来吧: public void stopGridViewScroll(){Field mFlingEndField = null;Method mFlingEndMethod;try {mFlingEndField = AbsListView

探索 Power BI Desktop 的奇妙世界:从基础到查询折叠的旅程

目录 前言 第一步:认识 Power BI Desktop 1.1 什么是 Power BI Desktop? 1.2 为什么选择 Power BI Desktop? 第二步:安装和设置 Power BI Desktop 2.1 安装 Power BI Desktop 2.2 初始设置 第三步:连接到数据源 3.1 支持的数据源类型 3.2 连接到 Excel 数据源 3.3

可以根据手机的折叠状态改变播放音效:nova Flip 的妙趣音效

由于折叠机最基础的“可折叠”属性,导致折叠机的扬声器相对于人的位置来说会存在更多的变化,在不同的折叠状态下,听感方面可能就会大有不同。 nova Flip手机利用这一特性,首次根据折叠形态差异,自适应了不同形态的音效氛围。 展开态:当手机是类似于直板机的展开态时,搭配首发的histen9.3音频算法,nova Flip拥有更具清晰度和更自然的音质效果,打造更具还原度的音效体验。   悬

GridView动态设置Item的宽高 第一个Item显示不正常

问题:       最近在项目中遇到一个很奇怪的问题,在做一种类似QQ空间图片显示效果中,我用的XLisview嵌套GridView,然后计算设置Gridview的item高度,设置为为正方形,并用Glide框架加载图片;     结果,在滚动时,第一个item就不能正常显示了。。。很郁闷。。源码是这样的 ViewHolder holder; if (convertView == null)