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 }
并在其间创建并保存了每个页面的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 }
其中,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>
可以看到,最外层的LinearLayout(L1)设置了padding属性。将cpt_gv_item_select_region的LinearLayout(L2)代表的实际内容区域的范围压缩。
这样,我们设置了L1和L2的点击事件之后,点击在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 }
代码中,可以比较明确的看到,各个区域监听事件的设置情况。
至此,主要思路阐述完毕,悬浮内容的显示和隐藏,在空白区域点击事件中进行处理。内容的实现请查看源码,不赘述,谢谢阅读!
因为涉及到后续的更新,为了方便源码的管理和更新,采取了应用的方式来获取源码,保证可用。
源码请于以下途径获取“http://mail.sina.com.cn/netdisk/download.php?id=21a861dbceca3ee79e1afa0341fa3f04fa”。
获取成功及压缩文件打开如下: