GridView是类似于ListView的控件,只是GridView可以使用多个列来呈现内容,而ListView是以行为单位,所以用法上是差不多的。

主布局文件,因为要做下拉刷新,所以加了一个ProgressBar,GridView的numColumns属性是指每一行有多少列

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.example.girdlayoutdemo.MainActivity" >
  6.  
  7. <ProgressBar
  8. android:id="@+id/pb"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_centerHorizontal="true" />
  12.  
  13. <GridView
  14. android:layout_below="@id/pb"
  15. android:id="@+id/gv"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:layout_margin="5dp"
  19. android:gravity="center"
  20. android:numColumns="2" >
  21. </GridView>
  22.  
  23. </RelativeLayout>

每个Item的布局文件,这里比较简单的一张图片加一段文字

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <ImageView
  8. android:id="@+id/item_iv"
  9. android:layout_width="fill_parent"
  10. android:layout_height="0dp"
  11. android:layout_weight="3" />
  12.  
  13. <TextView
  14. android:id="@+id/item_tv"
  15. android:layout_width="match_parent"
  16. android:layout_height="0dp"
  17. android:layout_weight="1" />
  18.  
  19. </LinearLayout>

主活动代码:

  1. public class MainActivity extends Activity {
  2. private GridView gv;
  3. private ProgressBar pb;
  4. private List<Map<String, Object>> list;
  5. private SimpleAdapter adapter;
  6. private GestureDetector gsDetector;
  7.  
  8. private Handler handler = new Handler() {
  9. @Override
  10. public void handleMessage(Message msg) {
  11. switch (msg.what) {
  12. case 1:
  13. pb.setVisibility(View.GONE);
  14. Toast.makeText(MainActivity.this, "刷新成功", 200).show();
  15. break;
  16. default:
  17. break;
  18. }
  19. }
  20. };
  21.  
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. pb = (ProgressBar) findViewById(R.id.pb);
  27. gv = (GridView) findViewById(R.id.gv);
  28. pb.setVisibility(View.GONE);
  29. initData();
  30. adapter = new SimpleAdapter(this, list, R.layout.item_layout,
  31. new String[] { "image", "text" }, new int[] { R.id.item_iv,
  32. R.id.item_tv });
  33. gv.setAdapter(adapter);
  34. gsDetector = new GestureDetector(this, new Mlistener());
  35. gv.setOnTouchListener(new OnTouchListener() {
  36.  
  37. @Override
  38. public boolean onTouch(View v, MotionEvent event) {
  39. // Log.e("MainActivity", event.getX()+"");
  40. return gsDetector.onTouchEvent(event);
  41. }
  42. });
  43. }
  44.  
  45. private void initData() {
  46. list = new ArrayList<Map<String, Object>>();
  47. for (int i = 0; i < 20; i++) {
  48. Map<String, Object> map = new HashMap<String, Object>();
  49. map.put("image", R.drawable.gift_item_default);
  50. map.put("text", "一只冰莹猪猪");
  51. list.add(map);
  52. }
  53. }
  54.  
  55. class Mlistener implements OnGestureListener {
  56.  
  57. @Override
  58. public boolean onDown(MotionEvent e) {
  59. return false;
  60. }
  61.  
  62. @Override
  63. public void onShowPress(MotionEvent e) {
  64.  
  65. }
  66.  
  67. @Override
  68. public boolean onSingleTapUp(MotionEvent e) {
  69. return false;
  70. }
  71.  
  72. @Override
  73. public boolean onScroll(MotionEvent e1, MotionEvent e2,
  74. float distanceX, float distanceY) {
  75. return false;
  76. }
  77.  
  78. @Override
  79. public void onLongPress(MotionEvent e) {
  80.  
  81. }
  82.  
  83. @Override
  84. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  85. float velocityY) {
  86. if (e2.getY() - e1.getY() > 0 && gv.getFirstVisiblePosition() == 0) {
  87. pb.setVisibility(View.VISIBLE);
  88. Animation animation = new ScaleAnimation(1f, 1f, 0, 1f);
  89. animation.setDuration(300);
  90. pb.startAnimation(animation);
  91.  
  92. new Thread(new Runnable() {
  93. @Override
  94. public void run() {
  95. try {
  96. Thread.sleep(2000);
  97. Message msg = new Message();
  98. msg.what = 1;
  99. handler.sendMessage(msg);
  100. } catch (InterruptedException e) {
  101. // TODO Auto-generated catch block
  102. e.printStackTrace();
  103. }
  104. }
  105. }).start();
  106.  
  107. }
  108. return false;
  109. }
  110.  
  111. }
  112.  
  113. }

解析:

在onCreate方法中先获取两个组件,然后把progressBar设置为隐藏,下拉的时候再显示,刷新完毕再隐藏。然后为GridView设置数据源,这里方便起见用SimpleAdapter,然后给GridView设置ontouchListener,并在onTouch方法中把触摸事件交给我们自定义的GestureDetector对象来处理,在GestureDetector的onFling方法中处理下拉事件,在里面判断是否下拉以及GridView是否在最顶端,如果是,显示progressBar控件并开一个线程来处理刷新,这里做模拟就睡眠2000毫秒,最后用message对象返回一个消息给Handler,Handler在主线程中更新GridView。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. pb = (ProgressBar) findViewById(R.id.pb);
  6. gv = (GridView) findViewById(R.id.gv);
  7. pb.setVisibility(View.GONE);
  8. initData();
  9. adapter = new SimpleAdapter(this, list, R.layout.item_layout,
  10. new String[] { "image", "text" }, new int[] { R.id.item_iv,
  11. R.id.item_tv });
  12. gv.setAdapter(adapter);
  13. gsDetector = new GestureDetector(this, new Mlistener());
  14. gv.setOnTouchListener(new OnTouchListener() {
  15.  
  16. @Override
  17. public boolean onTouch(View v, MotionEvent event) {
  18. // Log.e("MainActivity", event.getX()+"");
  19. return gsDetector.onTouchEvent(event);
  20. }
  21. });
  22. }
  1. class Mlistener implements OnGestureListener {
  2.  
  3. @Override
  4. public boolean onDown(MotionEvent e) {
  5. return false;
  6. }
  7.  
  8. @Override
  9. public void onShowPress(MotionEvent e) {
  10.  
  11. }
  12.  
  13. @Override
  14. public boolean onSingleTapUp(MotionEvent e) {
  15. return false;
  16. }
  17.  
  18. @Override
  19. public boolean onScroll(MotionEvent e1, MotionEvent e2,
  20. float distanceX, float distanceY) {
  21. return false;
  22. }
  23.  
  24. @Override
  25. public void onLongPress(MotionEvent e) {
  26.  
  27. }
  28.  
  29. @Override
  30. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  31. float velocityY) {
  32. if (e2.getY() - e1.getY() > 0 && gv.getFirstVisiblePosition() == 0) {
  33. pb.setVisibility(View.VISIBLE);
  34. Animation animation = new ScaleAnimation(1f, 1f, 0, 1f);
  35. animation.setDuration(300);
  36. pb.startAnimation(animation);
  37.  
  38. new Thread(new Runnable() {
  39. @Override
  40. public void run() {
  41. try {
  42. Thread.sleep(2000);
  43. Message msg = new Message();
  44. msg.what = 1;
  45. handler.sendMessage(msg);
  46. } catch (InterruptedException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. }
  51. }).start();
  52.  
  53. }
  54. return false;
  55. }
  56.  
  57. }

Android开发学习之路-下拉刷新以及GridView的使用的更多相关文章

  1. Android开发学习之路-下拉刷新怎么做?

    因为最近的开发涉及到了网络读取数据,那么自然少不了的就是下拉刷新的功能,搜索的方法一般是自己去自定义ListView或者RecyclerView来重写OnTouch或者OnScroll方法来实现手势的 ...

  2. android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面

    关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等.第一:大多数实现库都难以进行动画和样式的自己定义. 第二:不能非常好的兼容多种滚 ...

  3. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  4. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  5. Android UI--自定义ListView(实现下拉刷新+加载更多)

    Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...

  6. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  7. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  8. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  9. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

随机推荐

  1. Html5应用程序缓存ApplicationCache

    应用缓存机制可以参考http://www.w3school.com.cn/html5/html_5_app_cache.asp,不再赘述.利用此机制,html5游戏可以实现和native app类似的 ...

  2. DataTable 和Json 字符串互转

    #region DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...

  3. CM+CDH安装遇到的问题

    1.实在是在安装CDH的时候无法安装成功的话,只有重新启动了,下面给大家分享一个神器,按照这个脚本应该差不多就能卸载干净,然后重新安装,写一个脚本,内容如下,救命的神器呀: #!/bin/bash s ...

  4. MATLAB 画出三个通信小区cell边界示意图

    d=1000; %两个小区中心间距离的一半 rcell=2*d/sqrt(3); %小区半径 ncell=3; %小区个数 cellposition=zeros(ncell,2); %初始化小区中心位 ...

  5. [Python] Pitfalls: About Default Parameter Values in Functions

    Today an interesting bug (pitfall) is found when I was trying debug someone's code. There is a funct ...

  6. <Oracle Database>物理结构

    物理结构 Oracle物理结构包含了数据文件.日志文件和控制文件 数据文件 每一个Oracle数据库有一个或多个物理的数据文件.一个数据库的数据文件包含全部数据库数据.数据文件有下列特征: 一个数据文 ...

  7. VHDL生成的ngc文件被verilog的工程调用的问题

    1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into ...

  8. python多线程的用法之一

    import threadingimport time class thread_1(threading.Thread): sleep_time = 0 def __init__(self,id1): ...

  9. ubuntu常用配置

    安装文件共享服务 0.更改本机主机名,修改 /etc/hostname文件(ubuntu默认都是ubuntu) 1.安装 #sudo apt-get install samba samba-commo ...

  10. android 启动过程

    android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程. 接着,回启动Linux deamon(守护进程)会启动以下的内容: ①启动USBd ...