Android开发学习之路-下拉刷新以及GridView的使用
GridView是类似于ListView的控件,只是GridView可以使用多个列来呈现内容,而ListView是以行为单位,所以用法上是差不多的。
主布局文件,因为要做下拉刷新,所以加了一个ProgressBar,GridView的numColumns属性是指每一行有多少列
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.girdlayoutdemo.MainActivity" >
- <ProgressBar
- android:id="@+id/pb"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true" />
- <GridView
- android:layout_below="@id/pb"
- android:id="@+id/gv"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="5dp"
- android:gravity="center"
- android:numColumns="2" >
- </GridView>
- </RelativeLayout>
每个Item的布局文件,这里比较简单的一张图片加一段文字
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <ImageView
- android:id="@+id/item_iv"
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="3" />
- <TextView
- android:id="@+id/item_tv"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
- </LinearLayout>
主活动代码:
- public class MainActivity extends Activity {
- private GridView gv;
- private ProgressBar pb;
- private List<Map<String, Object>> list;
- private SimpleAdapter adapter;
- private GestureDetector gsDetector;
- private Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- pb.setVisibility(View.GONE);
- Toast.makeText(MainActivity.this, "刷新成功", 200).show();
- break;
- default:
- break;
- }
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- pb = (ProgressBar) findViewById(R.id.pb);
- gv = (GridView) findViewById(R.id.gv);
- pb.setVisibility(View.GONE);
- initData();
- adapter = new SimpleAdapter(this, list, R.layout.item_layout,
- new String[] { "image", "text" }, new int[] { R.id.item_iv,
- R.id.item_tv });
- gv.setAdapter(adapter);
- gsDetector = new GestureDetector(this, new Mlistener());
- gv.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // Log.e("MainActivity", event.getX()+"");
- return gsDetector.onTouchEvent(event);
- }
- });
- }
- private void initData() {
- list = new ArrayList<Map<String, Object>>();
- for (int i = 0; i < 20; i++) {
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("image", R.drawable.gift_item_default);
- map.put("text", "一只冰莹猪猪");
- list.add(map);
- }
- }
- class Mlistener implements OnGestureListener {
- @Override
- public boolean onDown(MotionEvent e) {
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- return false;
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- if (e2.getY() - e1.getY() > 0 && gv.getFirstVisiblePosition() == 0) {
- pb.setVisibility(View.VISIBLE);
- Animation animation = new ScaleAnimation(1f, 1f, 0, 1f);
- animation.setDuration(300);
- pb.startAnimation(animation);
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(2000);
- Message msg = new Message();
- msg.what = 1;
- handler.sendMessage(msg);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- }
- return false;
- }
- }
- }
解析:
在onCreate方法中先获取两个组件,然后把progressBar设置为隐藏,下拉的时候再显示,刷新完毕再隐藏。然后为GridView设置数据源,这里方便起见用SimpleAdapter,然后给GridView设置ontouchListener,并在onTouch方法中把触摸事件交给我们自定义的GestureDetector对象来处理,在GestureDetector的onFling方法中处理下拉事件,在里面判断是否下拉以及GridView是否在最顶端,如果是,显示progressBar控件并开一个线程来处理刷新,这里做模拟就睡眠2000毫秒,最后用message对象返回一个消息给Handler,Handler在主线程中更新GridView。
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- pb = (ProgressBar) findViewById(R.id.pb);
- gv = (GridView) findViewById(R.id.gv);
- pb.setVisibility(View.GONE);
- initData();
- adapter = new SimpleAdapter(this, list, R.layout.item_layout,
- new String[] { "image", "text" }, new int[] { R.id.item_iv,
- R.id.item_tv });
- gv.setAdapter(adapter);
- gsDetector = new GestureDetector(this, new Mlistener());
- gv.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // Log.e("MainActivity", event.getX()+"");
- return gsDetector.onTouchEvent(event);
- }
- });
- }
- class Mlistener implements OnGestureListener {
- @Override
- public boolean onDown(MotionEvent e) {
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- return false;
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY) {
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- if (e2.getY() - e1.getY() > 0 && gv.getFirstVisiblePosition() == 0) {
- pb.setVisibility(View.VISIBLE);
- Animation animation = new ScaleAnimation(1f, 1f, 0, 1f);
- animation.setDuration(300);
- pb.startAnimation(animation);
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- Thread.sleep(2000);
- Message msg = new Message();
- msg.what = 1;
- handler.sendMessage(msg);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- }
- return false;
- }
- }
Android开发学习之路-下拉刷新以及GridView的使用的更多相关文章
- Android开发学习之路-下拉刷新怎么做?
因为最近的开发涉及到了网络读取数据,那么自然少不了的就是下拉刷新的功能,搜索的方法一般是自己去自定义ListView或者RecyclerView来重写OnTouch或者OnScroll方法来实现手势的 ...
- android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面
关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等.第一:大多数实现库都难以进行动画和样式的自己定义. 第二:不能非常好的兼容多种滚 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
随机推荐
- Html5应用程序缓存ApplicationCache
应用缓存机制可以参考http://www.w3school.com.cn/html5/html_5_app_cache.asp,不再赘述.利用此机制,html5游戏可以实现和native app类似的 ...
- DataTable 和Json 字符串互转
#region DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...
- CM+CDH安装遇到的问题
1.实在是在安装CDH的时候无法安装成功的话,只有重新启动了,下面给大家分享一个神器,按照这个脚本应该差不多就能卸载干净,然后重新安装,写一个脚本,内容如下,救命的神器呀: #!/bin/bash s ...
- MATLAB 画出三个通信小区cell边界示意图
d=1000; %两个小区中心间距离的一半 rcell=2*d/sqrt(3); %小区半径 ncell=3; %小区个数 cellposition=zeros(ncell,2); %初始化小区中心位 ...
- [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 ...
- <Oracle Database>物理结构
物理结构 Oracle物理结构包含了数据文件.日志文件和控制文件 数据文件 每一个Oracle数据库有一个或多个物理的数据文件.一个数据库的数据文件包含全部数据库数据.数据文件有下列特征: 一个数据文 ...
- VHDL生成的ngc文件被verilog的工程调用的问题
1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into ...
- python多线程的用法之一
import threadingimport time class thread_1(threading.Thread): sleep_time = 0 def __init__(self,id1): ...
- ubuntu常用配置
安装文件共享服务 0.更改本机主机名,修改 /etc/hostname文件(ubuntu默认都是ubuntu) 1.安装 #sudo apt-get install samba samba-commo ...
- android 启动过程
android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程. 接着,回启动Linux deamon(守护进程)会启动以下的内容: ①启动USBd ...