热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidApp中的GridView网格布局使用指南

GridView布局所实现的就是类似于九宫格的矩阵界面效果,下面整理了AndroidApp中的GridView网格布局使用指南,包括分割线的添加与自定义GridView的实现等技巧,需要的朋友可以参考下

零、常用属性
首先我们来看看GridView的一些常用的属性吧

1.android:numColumns=”auto_fit” //GridView的列数设置为自动
2.android:columnWidth=”90dp ” //每列的宽度,也就是Item的宽度
3.android:stretchMode=”columnWidth”//缩放与列宽大小同步
4.android:verticalSpacing=”10dp” //两行之间的边距
5.android:horizOntalSpacing=”10dp” //两列之间的边距
6.android:cacheColorHint=”#00000000” //去除拖动时默认的黑色背景
7.android:listSelector=”#00000000” //去除选中时的黄色底色
8.android:scrollbars=”none” //隐藏GridView的滚动条
9.android:fadeScrollbars=”true” //设置为true就可以实现滚动条的自动隐藏和显示
10.android:fastScrollEnabled=”true” //GridView出现快速滚动的按钮(至少滚动4页才会显示)
11.android:fadingEdge=”none” //GridView衰落(褪去)边缘颜色为空,缺省值是vertical。(可以理解为上下边缘的提示色)
12.android:fadingEdgeLength=”10dip” //定义的衰落(褪去)边缘的长度
13.android:stackFromBottom=”true” //设置为true时,你做好的列表就会显示你列表的最下面
14.android:transcriptMode=”alwaysScroll” //当你动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内
15.android:drawSelectorOnTop=”false” //点击某条记录不放,颜色会在记录的后面成为背景色,内容的文字可见(缺省为false)

至于GridView的用法就不多说了,和ListView的用法一样。下面小编给打加分享一下GridView的一些比较特殊的情况吧。

一、GridView按钮图片点击效果

我们先来看看GridView按钮图片的点击效果吧,不是说每一个item的点击背景颜色的改变,那个很简单实现,自定义一个selector就可以实现,接下来小编要说的是每一个item上的imageview的点击效果….
要想实现这种功能我们要设置imageview的 android:clickable=”true”,看一下布局文件:


2.然后我们在自定义adapter中定义一个改变按钮图片的颜色方法,通过初始化adapter的时候,将九宫格的图片传过来,通过onTouch事件来改变颜色值

public View.OnTouchListener OnTouchListener= new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
      switch (event.getAction()) {
        case MotionEvent.ACTION_UP:
          changeLight((ImageView) view, 0);


          
          break;
        case MotionEvent.ACTION_DOWN:
          changeLight((ImageView) view, -80);
          break;
        case MotionEvent.ACTION_MOVE:
          
          break;
        case MotionEvent.ACTION_CANCEL:
          changeLight((ImageView) view, 0);
          break;
        default:
          changeLight((ImageView) view, 0);
          break;
      }
      return false;
    }

  };

  /**
  *改变gridview图片的颜色值
  **/
  private void changeLight(ImageView imageview, int brightness) {
    ColorMatrix matrix = new ColorMatrix();
    matrix.set(new float[] { 1, 0, 0, 0, brightness, 0, 1, 0, 0,
        brightness, 0, 0, 1, 0, brightness, 0, 0, 0, 1, 0 });
    imageview.setColorFilter(new ColorMatrixColorFilter(matrix));

  }

3.我们还需要定义一个接口实现gridview的onItem点击事件

public interface OnCustomItemClickListener{
  public int getPostion();
  public void onCustomItemClk(int i);
  }
  holder.itemImage.setOnTouchListener(onTouchListener);
    holder.itemImage.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        clickPos = i;
        listener.onCustomItemClk(clickPos);
      }
    });

大体思路和主要代码都跟大家介绍的很详细了,需要的小伙伴可以去下载源码….

二、GridView九宫格分割线效果实现(仿支付宝)

最近项目中要实现一个仿支付宝九宫格分割线的功能,因为项目比较急在网上找了找,发现都是设置一些背景来实现,闲的时候想了想,可以自定义一个GridView来实现,下面小编来分享一下实现方法

设置背景来实现九宫格分割线效果:

定义selector背景

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  
    

    
  
  
    

    
  
  
    

    

给布局设置这个背景就可以了,一点小瑕疵就是每一行重叠的线会比不重叠的粗,不认真看看不出来的,还可以凑合用,但是小编比较追求完美,下面看一下自定义GridView的实现方法吧。

三、自定义GridView实现:

思路:

1.通过反射获取GridView的列数

2.获取GridView的childview

3.根据childview的情况画线

代码:

@Override
  protected void dispatchDraw(Canvas canvas)
  {
    super.dispatchDraw(canvas)

    int column = 1
    try
    {
      //通过反射拿到列数
      Field field = GridView.class.getDeclaredField("mNumColumns")
      field.setAccessible(true)
      column = field.getInt(this)
    }
    catch (NoSuchFieldException e)
    {
      e.printStackTrace()
    }
    catch (IllegalAccessException e)
    {
      e.printStackTrace()
    }

    int childCount = getChildCount()
    Paint paint = new Paint()
    paint.setStyle(Paint.Style.STROKE)
    paint.setColor(getContext().getResources().getColor(R.color.line))
    for (int i = 0
    {
      View cellView = getChildAt(i)
      Log.e(">>>>>>>>>>>>>>>","i="+i+"||||||||||"+"top"+cellView.getTop()+"bottom"+cellView.getBottom()+"left"+cellView.getLeft()+"right"+cellView.getRight())

      if (cellView.getTop()!=0){
        //顶部线,坐标+1是为了画在cellView上
        canvas.drawLine(cellView.getLeft(), cellView.getTop() + 1, cellView.getRight(), cellView.getTop() + 1, paint)
      }

      //左边线
      canvas.drawLine(cellView.getLeft() + 1, cellView.getTop(), cellView.getLeft() + 1, cellView.getBottom(), paint)

      if ((i + 1) % column == 0)   //最右边一列单元格画上右边线
      {
        canvas.drawLine(cellView.getRight(), cellView.getTop() + 1, cellView.getRight(), cellView.getBottom() + 1, paint)
      }
      if ((i + column) >= childCount) //最后column个单元格画上底边线
      {
        canvas.drawLine(cellView.getLeft(), cellView.getBottom() + 1, cellView.getRight(), cellView.getBottom() + 1, paint)
      }
      if (childCount % column != 0 && i == childCount - 1)  //如果最后一个单元格不在最右一列,单独为它画上右边线
      {
        canvas.drawLine(cellView.getRight() + 1, cellView.getTop() + 1, cellView.getRight() + 1, cellView.getBottom() + 1, paint)
        canvas.drawLine(cellView.getRight()+1, cellView.getBottom() + 1, cellView.getLeft(), cellView.getBottom() + 1, paint)
      }
    }
  }

四、给每行添加上分割线

大概思想就是:既然在GridView里没有设置的方法,那就直接加在item里,在通过别的方法改变item的显示效果,从而达到设置分割线的方法~废话不多说~下面详细的介绍:首先是GridView的布局,android:numColumns=”3″ 每行三列



接下来是item的布局

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


  

  



接下来是最重要的数据显示了,自定义一个GridViewAdapter继承

public class GridViewAdapter extends BaseAdapter {
  private LayoutInflater inflater;
  private Context context;
  private List> list = new ArrayList>();

  public GridViewAdapter(Context context, List> list) {
    super();
    this.cOntext= context;
    this.list = list;
    inflater = LayoutInflater.from(context);
  }

  @Override
  public int getCount() {
    return list.size();
  }

  @Override
  public Object getItem(int position) {
    return list.get(position);
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup arg2) {
    Viewholder viewholder = null;
    if (cOnvertView== null) {
      cOnvertView= inflater.inflate(R.layout.gridview_item, null);
      viewholder = new Viewholder(convertView);
      convertView.setTag(viewholder);
    } else {
      viewholder = (Viewholder) convertView.getTag();
    }
    viewholder.update(list.get(position),position);
    return convertView;
  }

  public class Viewholder {
    private ImageView imageView;
    private TextView textView;
    private FrameLayout layout;
    private View view;
    public Viewholder(View convertView) {
      imageView=(ImageView) convertView.findViewById(R.id.imageView);
      textView=(TextView) convertView.findViewById(R.id.textView);
      layout=(FrameLayout) convertView.findViewById(R.id.layout);
      view=convertView.findViewById(R.id.line);
    }

    public void update(Map map,int position) {
      textView.setText(map.get("name").toString());
      int i=0;
      i=position%3;
      switch (i) {
      case 0:
        //每列第一个item不包括分割线的layout右内边距20
        layout.setPadding(0, 0, 20, 0);
        break;
      case 1:
        //每列第二个item不包括分割线的layout左、右内边距各10
        layout.setPadding(10, 0, 10, 0);
        break;
      case 2:
        //每列第三个item不包括分割线的layout左内边距20;必须使三个item的宽度一致
        layout.setPadding(20, 0, 0, 0);
        break;
      default:
        break;
      }
      String id=map.get("id").toString();
      setImage(id, imageView);
      setLine(position, view);
    }
  }

  private void setImage(String id,ImageView imageView){
    if(id.equals("1")){
      imageView.setImageResource(R.drawable.img1);
    }else if(id.equals("2")){
      imageView.setImageResource(R.drawable.img2);
    }else if(id.equals("3")){
      imageView.setImageResource(R.drawable.img3);
    }else if(id.equals("4")){
      imageView.setImageResource(R.drawable.img4);
    }else if(id.equals("5")){
      imageView.setImageResource(R.drawable.img5);
    }
  }

  private void setLine(int position,View view){
    int i=0;
    i=list.size()%3;
    if(position+i+1>list.size()){
      //最后一行分割线隐藏
      view.setVisibility(View.GONE);
    }
  }


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
双鱼天脎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有