纯原生打造GridView单行横向滑动(宽度自适应在父布局居中),手机屏幕px和dp的互换方法,附禁止滑动的自定义方法

来源:互联网 发布:java 垃圾回收 手动 编辑:程序博客网 时间:2024/06/04 20:01

布局文件:
HorizontalScrollView包裹LinearLayout(只能包裹这个),放入GridView,先实现横向滑动

         <HorizontalScrollView                android:fillViewport="true"                android:layout_width="match_parent"                android:layout_height="85dp"                android:scrollbars="none"                android:layout_gravity="center_horizontal"                android:background="@android:color/white">                <LinearLayout                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="center_horizontal">                    <GridView                        android:id="@+id/gv_tequan"                        android:layout_width="wrap_content"                        android:layout_height="match_parent"                        android:cacheColorHint="#00000000"                        android:scrollbars="none"                        android:layout_gravity="center_horizontal"                        android:listSelector="#00000000"></GridView>                </LinearLayout><!--@color/title_bg_color android:scrollbars="horizontal"-->            </HorizontalScrollView>

Java代码将GridView改成单行横向布局的工具类方法
只需要传入要改变的GridView对象和item的宽度即可实现

  private void changeGridView(GridView mContentGv) {        LinearLayout.LayoutParams params=null;        int with=this.getWindowManager().getDefaultDisplay().getWidth();//获取手机屏幕宽度px        int withdip=DensityUtil.px2dip(this,with);//dip        int size = img_tequan.length;        // item宽度Gridview宽度在这里动态设置的        int shang=(int) withdip/80;        int itemWidth = DensityUtil.dip2px(this, 80);        int totalWidth=0;        if (shang>size){//item数量小于可以显示的最大容量//            itemWidth =DensityUtil.px2dip(this, (int)withdip/(size));//            totalWidth=DensityUtil.px2dip(this, itemWidth*size);            totalWidth= itemWidth*size;            mContentGv.setGravity(Gravity.CENTER_HORIZONTAL);        }else if(shang<=size) {//            itemWidth=DensityUtil.px2dip(this, 85);            totalWidth=itemWidth*size+size;        }        // item之间的间隔//        int itemPaddingH = DensityUtil.dip2px(this, 1);        // 计算GridView宽度 size * (itemWidth + itemPaddingH)        int gridviewWidth = totalWidth;            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);    }

上文中的DensityUtil也是一个封装的方法,用来实现手机屏幕像素px和安卓开发的虚高和虚宽的相互转换,代码如下:

public class DensityUtil {    /**     * 根据手机的分辨率从 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);    }    /**     *       * 根据手机的分辨率从 px(像素) 的单位 转成为 dp      *           */    public static int px2dip(Context context, float pxValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (int) (pxValue / scale + 0.5f);    }}

经过以上方法设置就可以实现GridView自适应宽度并且在父布局居中显示,
当item的总宽小于屏幕宽度时居中显示不滑动,
当item的总宽大于屏幕宽度时根据传入的item宽度计算总宽度,实现单行横向滑动
附:GridView禁止滑动的自定义方式:
GridView默认是竖直滑动,有时候只有一行也会滑动一点,为了显示效果简介需要禁止滑动,自定义GridView重写 dispatchTouchEvent方法,截取滑动事件:

public class MyGridView extends GridView {    public MyGridView(Context context) {        super(context);    }    public MyGridView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if(ev.getAction() == MotionEvent.ACTION_MOVE){            return true;//禁止Gridview进行滑动        }        return super.dispatchTouchEvent(ev);    }
阅读全文
0 0
原创粉丝点击