zoukankan      html  css  js  c++  java
  • Android 之 GridView具体解释

      工作这么久以来,都是以解决需求为目标。渐渐发现这样的学习方式不好,学到的知识能立即解决这个问题,但没有经过梳理归纳。

    故想系统总结下一些有趣味的知识点。

    在这篇博客中想以一个样例系统解说下GridView控件涉及到的方方面面,比方监听,背景图的设置等。

      1.控件属性介绍

         android:listSelector="@drawable/bg"

            //该属性非常重要,假设不设置的话,GridView控件会自带自己的选中样式(黄色边框),如图所看到的:

          

          做项目通常是不须要这个的。所以解决的方法是将GridView的android:listSelector属性设置为和Activity背景相同就可以。
        android:verticalSpacing="10dp"  //行宽
        android:horizontalSpacing="10dip"  //列宽
        android:numColumns="3"  //列数

        android:stretchMode="columnWidth"  //列可扩展
          以上列数为3,若想在高分辨率中列数设置为4怎么办呢。

        首先,须要在属性中设置列为可扩展android:stretchMode="columnWidth"。然后在代码中做个推断:

        if(Metrics.heightPixels == 1280 && Metrics.widthPixels == 800){
                   gridview.setNumColumns(4);
              }这样GridView的列数是能够随分辨率不同而做很多其它的设置。

      2.样例一:设置个边框,而且右上角设置个CheckBox来美化选中状态(左图→右图)。

                   →→→

       这个Item的xml设计中。我是用两个ImageView控件来实现的.

       第一个ImageView 要设置一个属性:android:layout_margin="4dip"。上下左右留出4dip的详细来显示边框的效果。而且在对应的Adapter中做个推断,选中的话背景图片颜色为#87CEFA,未选中时为3FFFFFF:

      if(bSelect){ //bSelect表示是否选中
            arg1.setBackgroundColor(Color.parseColor("#87CEFA"));
        }else{
            arg1.setBackgroundColor(Color.parseColor("#FFFFFF"));

      右上角的看起来像复选框,事实上我也是用ImageView控件来实现的。

    界面设计非常重要,距离要对好。我设置的该控件离上边距和右边距分别为2dip的距离。相同的仅仅须要改动该ImageView所绑定的图片就能够。

      if(bSelect){
         viewclass.checkboxImage.setImageBitmap(bmpwater_sel); //bmpwater_sel表示左图右上角的图片
        }else{
         viewclass.checkboxImage.setImageBitmap(bmpwater_unsel); //bmpwater_unsel表示右图右上角的图片
          }

      非常easy吧。你们能够试试。

      3.样例二:打开一个GridView控件的Activity时,假设打开的图片过多,怎样让图片异步载入。如图所看到的:

          → 

      首先在界面定义中要定义一个全屏显示的载入圈效果,叫做mLoading。程序刚启动时显示图片载入结束后调用函数mLoading.setVisibility(View.GONE);让它不显示。我是用一个函数来调用它,这样更好的体现了封装性,例如以下:

       private void showLoading(boolean bShow){
          if(mLoading == null) return;
          mLoading.setVisibility(bShow ? View.VISIBLE : View.GONE);
       }

      xml中该载入框的设计例如以下:  

    <span style="font-size: 13px;"><RelativeLayout android:id="@+id/video_tip_layout"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
    <ProgressBar style="?

    android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:id="@+id/video_tip_progressbar" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <TextView android:textAppearance="?

    android:attr/textAppearanceMedium" android:id="@+id/video_tip_text" android:text="载入中..." android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/video_tip_progressbar" android:textColor="#808080" android:layout_centerHorizontal="true"></TextView> </span>

         ①为了不卡主线程,实现这一的效果要多开一个线程。

    在该线程中调用函数InitList(),在该函数中将图片载入到ArrayList中去(花时间最多的就是对多图片的处理,这个放在子线程中能够不卡主线程。假设直接在主线程中做。会让画面出现2-3秒的黑屏停顿)。

      像这样。在onCreate方法中开一个子线程:

      new Thread(new Runnable() {
         @Override
         public void run() {
            InitList();
         }
        }).start();

      ②方法InitList()中要做两件事情。一是载入图片,二是通知Handler图片载入完毕(由于子线程不能够操作UI控件,仅仅能通过Handler的方式)。

      private void InitList()
      {

        XXXX; //载入图片代码
          mMainHandler.sendMessage(MainHandler.MSG_FINISH); //发送消息
        }

      ③当收到InitList发送的消息时就让上面所提的mLoading不显示。同一时候GridView绑定adapter的代码也在这个里面写。

    由于图片载入完毕后再绑定adapter,这样图片才干所有显示。否则仅仅能显示一部分。

         case MSG_FINISH:
            showLoading(false); //让载入框不再显示
            gridview.setAdapter(ia); //绑定数据
           break;
         default:
           break;

      提供几张我们专业设计师做的美图,大家能够下载素材尝试一下。做个demo。地址:http://www.kuaipan.cn/file/id_37676161790126914.html


    原文链接:http://www.cnblogs.com/carmanloneliness/archive/2012/05/29/android_%E8%B6%A3%E5%91%B3%E7%9A%84gridView%E6%8E%A7%E4%BB%B6.html

  • 相关阅读:
    MYSQL 神奇的操作insert into test select * from test;
    mysql innodb与myisam存储文件的区别
    centos 普通用户 和 root 相互切换方法
    MySQL
    mysql查看数据库表数量
    PHP是单线程还是多线程?
    PHP如何解决网站大流量与高并发的问题(一)
    PHP如何解决网站大流量与高并发的问题(二)
    Work at home, Work as a distributed team | TVP思享
    区块链上的虚拟开放世界游戏是怎样的?| TVP思享
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10695253.html
Copyright © 2011-2022 走看看