Android GridView

                    滑动翻页+区域点击事件

  如有转载,请保留原文地址:“http://www.cnblogs.com/LuoYer/p/3409988.html”,谢谢!

  声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。

 

   程序猿媛 系统博文,发表在 http://my.oschina.net/gluoyer/blog,欢迎!

  本文介绍了,利用GrideView的扩展,结合ViewPager设置FragmentPagerAdapter,实现如下功能:

  • 九宫格样式显示列表项,可左右滑动切换页面;
  • 点击空白区域,显示和隐藏悬浮内容。

  首先,看下实现效果:

             

  •   九宫格样式显示列表,左右滑动切换页面

    九宫格样式,自然想到GrideView;而左右滑动切换,又是ViewPager的强项。此例结合了这两者来实现。

    ViewPager的内容可以设置FragmentPagerAdapter,即:每一项都可以是一个Fragment。再为每个Fragment设置一个包含3x3的GrideView,就是功能实现的基础。

    代码实现了ChapterAdapter,继承字FragmentPagerAdapter:

 1 public class ChapterAdapter extends FragmentPagerAdapter{
 2     public final static int CHAPTER_PAGE_NUM = 9;
 3     private ArrayList<Fragment> mFragments;
 4     
 5     public ChapterAdapter(FragmentManager fm, ArrayList<ArrayList<String>> arrayLists) {
 6         super(fm);
 7         mFragments = new ArrayList<Fragment>();
 8         int startPos = 0; // count the click offset
 9         for(ArrayList<String>list : arrayLists) {
10             mFragments.add(ChapterFragment.getNewInstance(startPos * CHAPTER_PAGE_NUM, list));
11             startPos ++;
12         }
13     }
14 }
ChapterAdapter

    并在其间创建并保存了每个页面的ChapterFragment。

    ChapterFragment中,定义了GetView的ChapterGvAdapter,以及点击事件监听onChapterPageClickListener:用于屏蔽自身点击事件,以及后续将要介绍的,显示和隐藏悬浮内容的空白处点击事件。

 1 public class ChapterFragment extends Fragment {
 2     public void onCreate(Bundle savedInstanceState) {
 3         // 这里很重要,填充空白内容
 4         if(mNameList.size() < ChapterAdapter.CHAPTER_PAGE_NUM) {
 5             for(int i=mNameList.size(); 
 6                 i<ChapterAdapter.CHAPTER_PAGE_NUM; i++) {
 7                 mNameList.add(null);
 8             }
 9         }
10     private class ChapterGvAdapter extends BaseAdapter {
11         // 稍后介绍
12 13    // 各项及空白处点击事件监听
14    public interface onChapterPageClickListener {
15         public abstract void onChapterItemClick(int position, String name);
16         public abstract void onChapterSpaceClick();
17     }
18
ChapterFragment

    其中,onCreate中,填充空白处很重要,请注意了解。因为,不可能保证每页恰好9项内容,所以,添加特殊的null内容,在添加View的时候,设置其点击事件,避免点击无响应的情况。

  •   点击空白区域,显示和隐藏悬浮内容

     此部分功能,关键部分为:

    1.布局文件嵌套空白区域;

    2.ChapterGvAdapter的getView中设置事件监听。

    一、布局文件嵌套空白区域

 1 <LinearLayout 
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:paddingLeft="16dip"
 5     android:paddingRight="16dip"
 6     android:paddingTop="20dip"
 7     android:paddingBottom="20dip"
 8     android:gravity="center" >    
 9     <LinearLayout
10         android:id="@+id/cpt_gv_item_select_region"
11         android:clickable="true" >
12         <!-- set default background, to hold the sapce for empty item -->
13         <ImageView
14             android:id="@+id/cpt_gv_item_img"
15             android:src="@drawable/ic_launcher"/>    
16         <TextView
17             android:id="@+id/cpt_gv_item_name" />
18     </LinearLayout>
19 </LinearLayout>
chapter_gridview_item.xml

    可以看到,最外层的LinearLayout(L1)设置了padding属性。将cpt_gv_item_select_region的LinearLayout(L2)代表的实际内容区域的范围压缩。

    这样,我们设置了L1L2的点击事件之后,点击在L2区域,就触发了L2的点击事件,处理onChapterItemClick事件,模拟GrideView项点击事件;而点击在L1的padding区域,就触发了L1的点击事件,去处理onChapterSpaceClick事件,就是增加的空白区域点击事件响应了。

      二、ChapterGvAdapter的getView中设置事件监听

 1 private class ChapterGvAdapter extends BaseAdapter {
 2     public View getView(final int position, View convertView, ViewGroup parent) {
 3     // shadow the default GridView item click event
 4     convertView.setOnClickListener(new OnClickListener() {
 5         @Override
 6         public void onClick(View v) {
 7             mClickListener.onChapterSpaceClick();
 8         }
 9     });
10     // Has content, set its click listener
11     if(null != mNameList.get(position)) {
12         holder.mSelectRegion.setOnClickListener(new OnClickListener() {
13             @Override
14             public void onClick(View v) {
15                 mClickListener.onChapterItemClick(mStartPos + position, mNameList.get(position));
16             }
17         });
18         Utils.setVisible(holder.mSelectRegion);
19         holder.mName.setText(mNameList.get(position));
20     }
21     // no content, do the same as convertView do.
22     // if not set this listener, click no content space will no response.
23     else {
24         holder.mSelectRegion.setOnClickListener(new OnClickListener() {
25             @Override
26             public void onClick(View v) {
27                 mClickListener.onChapterSpaceClick();
28             }
29         });
30         Utils.setInvisible(holder.mSelectRegion);
31     }
32     // Default image, do transfer and set what your want, like i set name upside.
33     holder.mIcon.setImageResource(R.drawable.ic_launcher);
34     return convertView;
35     }
36
ChapterGvAdapter

    代码中,可以比较明确的看到,各个区域监听事件的设置情况。

  至此,主要思路阐述完毕,悬浮内容的显示和隐藏,在空白区域点击事件中进行处理。内容的实现请查看源码,不赘述,谢谢阅读!

 

  因为涉及到后续的更新,为了方便源码的管理和更新,采取了应用的方式来获取源码,保证可用。

源码请于以下途径获取“http://mail.sina.com.cn/netdisk/download.php?id=21a861dbceca3ee79e1afa0341fa3f04fa”。

  获取成功及压缩文件打开如下:

    

 

 

 

 

posted on 2013-11-06 14:59  花佟林雨月  阅读(1060)  评论(0编辑  收藏  举报