可横屏左右滑动的GridView

来源:互联网 发布:java解压缩gz文件 编辑:程序博客网 时间:2024/05/01 18:05

http://blog.csdn.net/lilu_leo/article/details/7378810


关于屏幕左右滑动,自己以前写过两篇文章:页面滑动切换(类Launcher滑动屏幕实现),launcher修改--左右滑动屏幕切换源码追踪,但是以前有个朋友问如何加个GridView,后来找到这个代码,关于ScrollLayout部分,作者也是修改的launcher的代码,读者可以自己去看代码(下面有下载地址),也可以看下上面两篇文章关于跳转的分析,在这里就不详细解读了。

           关键看下他的GridView是如何加载的,在ScrGriActivity中,我们可以看到:

[java] view plaincopy
  1. /** 
  2.      * 添加GridView 
  3.      */  
  4.     private void setGrid() {  
  5.         PageCount = (int) Math.ceil(lstDate.size() / PAGE_SIZE);  
  6.         if (gridView != null) {  
  7.             curPage.removeAllViews();  
  8.         }  
  9.         for (int i = 0; i < PageCount; i++) {  
  10.             gridView = new GridView(ScrGriActivity.this);  
  11.             gridView.setAdapter(new DateAdapter(ScrGriActivity.this, lstDate, i));  
  12.             gridView.setNumColumns(3);  
  13.             gridView.setHorizontalSpacing(8);  
  14.             gridView.setVerticalSpacing(8);  
  15.             // 去掉点击时的黄色背景  
  16.             gridView.setSelector(R.drawable.bg_grid_item);  
  17.             gridView.setOnItemClickListener(gridListener);  
  18.             curPage.addView(gridView);  
  19.         }  
  20.     }  

        我们好好看下:

[java] view plaincopy
  1. gridView.setAdapter(new DateAdapter(ScrGriActivity.this, lstDate, i));  

PageCount是根据GridView里面item个数和每页GridView显示的个数计算出来的左右滑动的页数,lstDate是一个ArrayList的数据集。

[java] view plaincopy
  1. /** 数据集. */  
  2.     private List<Info> lstDate = new ArrayList<Info>();  

在这里,就要看下DateAdapter的定义了,其实比较关键的一点也在于数据的加载。

[java] view plaincopy
  1. package com.adapter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import com.mod.Info;  
  6. import com.qu.R;  
  7. import android.content.Context;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.TextView;  
  13.   
  14. public class DateAdapter extends BaseAdapter {  
  15.   
  16.     private Context context;  
  17.     /** 列表. */  
  18.     private List<Info> lstDate;  
  19.     /** 名字. */  
  20.     private TextView txtName;  
  21.     /** 性别. */  
  22.     private TextView txtSex;  
  23.     /** 年龄. */  
  24.     private TextView txtAge;  
  25.   
  26.     // 每页显示的Item个数  
  27.     public static final int SIZE = 12;  
  28.   
  29.     public DateAdapter(Context mContext, List<Info> list, int page) {  
  30.         this.context = mContext;  
  31.         lstDate = new ArrayList<Info>();  
  32.         int i = page * SIZE;  
  33.         int iEnd = i + SIZE;  
  34.         while ((i < list.size()) && (i < iEnd)) {  
  35.             lstDate.add(list.get(i));  
  36.             i++;  
  37.         }  
  38.     }  
  39.   
  40.     @Override  
  41.     public int getCount() {  
  42.         return lstDate.size();  
  43.     }  
  44.   
  45.     @Override  
  46.     public Object getItem(int position) {  
  47.         return lstDate.get(position);  
  48.     }  
  49.   
  50.     @Override  
  51.     public long getItemId(int position) {  
  52.         return position;  
  53.     }  
  54.   
  55.     @Override  
  56.     public View getView(int position, View convertView, ViewGroup parent) {  
  57.         Info user = lstDate.get(position);  
  58.         convertView = LayoutInflater.from(context).inflate(R.layout.item, null);  
  59.   
  60.         txtName = (TextView) convertView.findViewById(R.id.txt_userName);  
  61.         txtSex = (TextView) convertView.findViewById(R.id.txt_userSex);  
  62.         txtAge = (TextView) convertView.findViewById(R.id.txt_userAge);  
  63.    
  64.         txtName.setText(user.getName());  
  65.         txtSex.setText("性别:" + user.getSex());  
  66.         txtAge.setText("年龄段:" + user.getAge());  
  67.   
  68.         return convertView;  
  69.     }  
  70.   
  71. }  

在这里,代码的耦合度有点高,可以把      

[java] view plaincopy
  1. private List<Info> lstDate;  

换成

[java] view plaincopy
  1. private List<Object> lstDate;  
[java] view plaincopy
  1. @Override  
  2.     public View getView(int position, View convertView, ViewGroup parent) {  
  3.         Info user = lstDate.get(position);  
  4.         convertView = LayoutInflater.from(context).inflate(R.layout.item, null);  

加上个强制类型转换:

[java] view plaincopy
  1. Info user = (Info)lstDate.get(position);  

主要有意思的地方在于他的构造方法:

[java] view plaincopy
  1. public DateAdapter(Context mContext, List<Info> list, int page) {  
  2.         this.context = mContext;  
  3.         lstDate = new ArrayList<Info>();  
  4.         int i = page * SIZE;  
  5.         int iEnd = i + SIZE;  
  6.         while ((i < list.size()) && (i < iEnd)) {  
  7.             lstDate.add(list.get(i));  
  8.             i++;  
  9.         }  
  10.     }  

在ScrGriActivity里面构造方法被执行了i次,curPage既自定义的左右滑动控件
[html] view plaincopy
  1. private ScrollLayout curPage;  
一共i次添加GridView,代码里作者还添加了GridView的点击事件。

[java] view plaincopy
  1. for (int i = 0; i < PageCount; i++) {  
  2.             gridView = new GridView(ScrGriActivity.this);  
  3.             gridView.setAdapter(new DateAdapter(ScrGriActivity.this, lstDate, i));  
  4.             gridView.setNumColumns(3);  
  5.             gridView.setHorizontalSpacing(8);  
  6.             gridView.setVerticalSpacing(8);  
  7.             // 去掉点击时的黄色背景  
  8.             gridView.setSelector(R.drawable.bg_grid_item);  
  9.             gridView.setOnItemClickListener(gridListener);  
  10.             curPage.addView(gridView);  
  11.         }  


         我那个朋友是直接仿照页面滑动切换(类Launcher滑动屏幕实现)这个进行的修改,直接在xml里面添加的GridView导致最后设置GridView的点击事件不能被监听。可以参考这个例子实现,另外,这个代码中页面标记做的不太好,可以参考launcher修改--左右滑动屏幕切换源码追踪和页面滑动切换(类Launcher滑动屏幕实现)这两篇里面的页面标记实现一下。

0 0
原创粉丝点击