Aandroid在ViewPager中添加ListView
2015-02-16 13:47
274 查看
最近的项目中碰到一个需要横竖都能滑动的页面效果,如同手机qq的好友菜单界面(如下图),可以通过选项卡来选择需要的界面,也可以通过屏幕手指的滑动来实现,而每一个分页面的内容对应的是一个可以上下滑动的ListView,所以最后结合起来的效果是,在页面中可以上下滑动,在各个分页之间可以左右滑动。
对于这个效果有两种方案,一种是通过TabActivitiy来实现,将选项卡设置为TabActibitiy的标志,通过将需要的分页加载到Tab的各个标志中去,但是这种方法,由于每一次切换选项卡的时候都会重新去创建一个新Activity的实例,所以当界面很多时切换会很迟钝,同时这种方法不能实现屏幕手指滑动来切换界面。
另外一种就是今天要讲的,在ViewPager中添加ListView。
先说ViewPager,ViewPager是google官方提供的一个兼容低版本android设备的软件包,
ViewPager的主要功能是使视图左右滑动,单纯ViewPaager添加静态页面的教程可以在网上搜到,这里只是简单介绍:(看不太懂的请参考其他ViewPager教程)
1.在布局文件中加入组件
<android.support.v4.view.ViewPager
android:id="@+id/heroPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>和android的其他组件一样,这里只需要声明一个组件,并指定它的基本属性。
2.加载要显示的选项卡
<pre name="code" class="java" style="color: rgb(70, 70, 70); font-size: 14px; line-height: 21px; text-indent: 28px;"><span style="font-family: 宋体;">//这个方法从viewPager中移动当前的view。</span>
public void destroyItem(View container, int position, Object object){} //这个方法返回一个对象,该对象表明PagerAapter选择哪个对象放在当前的ViewPager中。
public Object instantiateItem(View container, int position){}
4.为viewPager添加适配器:
viewPager.setAdapter(new HeroPagerAdapter(viewList));
好了,以上是在ViewPager中添加常规的静态界面的方法,对于listview,是需要设置适配器的,listview本身也是一个动态的组件,下面将介绍如何在ViewPager中添加动态的listview。
同样的,要先在布局文件中加入ViewPager组件,同以上步骤1.
第二步,也是最重要的一步。
前几个操作和以上是一样的,先声明一个LayoutInflater对象:LayoutInflater inflater = getLayoutInflater();获取viewPager组件:
这里,我曾经试过如下方法,都是错误的,希望大家引起注意:
直接通过强制类型转换,将View对象转换为ListView对象:
ListView view1 = (ListView) inflater.inflate(R.layout.hero_list, null);
这个方法编译可以通过,但是在运行时系统会报出一个类型转换的错误!
直接通过findViewbyId方法通过listview的组件ID来获取listview对象:
ListView listView1 = (ListView)findViewById(R.id.heroList);
这个方法也是编译时可以通过,运行时在这一步不会出现问题,但是当下面为listview添加SimpleAdpater适配器的时候,会抛出一个空指针异常,调试模式到这一步时,会观察到通过findViewbyId方法得到的listview是一个空对象。
原来findviewById是View这个类中的方法,默认调用时其实应该是:
this.findviewById();
由于上图代码中的R.id.herolist这个listview的声明并不在当前的viewPager所在的xml布局中,所以直接通过findviewById方法是不能得到该listview的实例的。
既然知道了findviewById()原理,那么就好办了!直接先通过LayoutInflater对象来实例化listview所在的布局,然后通过这个view的findviewById方法来获取listview的实例。
View view1 = inflater.inflate(R.layout.hero_list, null);
View view2 = inflater.inflate(R.layout.hero_list, null);
ListView listview1 = view1.findViewById(R.id.heroList);
ListView listview2 = view1.findViewById(R.id.heroList);
注意view对应的布局是hero_list,listview对应的布局是herolist,两者不一样。
也可以简化如下:
ListView listView1 = (ListView) (inflater.inflate(R.layout.hero_list,
null)).findViewById(R.id.heroList);
ListView listView2 = (ListView) (inflater.inflate(R.layout.hero_list, null)).findViewById(R.id.heroList);
剩下的步骤3和步骤4和上文中的一样,重写PagerAdapter类并添加适配器。
不过不要忘了给每一个listview都添加一个适配器,listview添加SimpleAdapter的步骤我相信大家已经很熟悉了,这里就不再详述了,直接上代码:
到这里,就和以上的不一样了!!
LayoutInflater对象的inflater方法只能实例化一个view对象,由于android中不能通过直接将一个xml布局声明为一个Listview,所以就不能直接通过inflater方法来实例listview对象。
这样就成功的将两个listview添加到ViewPager中了,以下是效果图,(水平有限,不知道怎么做动态的效果图)
在刚开始做这个的时候,也在网上搜索过关于在viewPager中添加listview的方法,都没有找到相关的教程,自己摸索了一天终于把它做出来了,这里和大家分享一下,也希望能给需要类似效果的朋友一些帮助。
对于这个效果有两种方案,一种是通过TabActivitiy来实现,将选项卡设置为TabActibitiy的标志,通过将需要的分页加载到Tab的各个标志中去,但是这种方法,由于每一次切换选项卡的时候都会重新去创建一个新Activity的实例,所以当界面很多时切换会很迟钝,同时这种方法不能实现屏幕手指滑动来切换界面。
另外一种就是今天要讲的,在ViewPager中添加ListView。
先说ViewPager,ViewPager是google官方提供的一个兼容低版本android设备的软件包,
ViewPager的主要功能是使视图左右滑动,单纯ViewPaager添加静态页面的教程可以在网上搜到,这里只是简单介绍:(看不太懂的请参考其他ViewPager教程)
1.在布局文件中加入组件
<android.support.v4.view.ViewPager
android:id="@+id/heroPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>和android的其他组件一样,这里只需要声明一个组件,并指定它的基本属性。
2.加载要显示的选项卡
<pre name="code" class="java" style="color: rgb(70, 70, 70); font-size: 14px; line-height: 21px; text-indent: 28px;"><span style="font-family: 宋体;">//这个方法从viewPager中移动当前的view。</span>
public void destroyItem(View container, int position, Object object){} //这个方法返回一个对象,该对象表明PagerAapter选择哪个对象放在当前的ViewPager中。
public Object instantiateItem(View container, int position){}
//返回当前分页数。public int getCount() { return mListViews.size(); }
//该方法判断是否由该对象生成界面。public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; }
4.为viewPager添加适配器:
viewPager.setAdapter(new HeroPagerAdapter(viewList));
好了,以上是在ViewPager中添加常规的静态界面的方法,对于listview,是需要设置适配器的,listview本身也是一个动态的组件,下面将介绍如何在ViewPager中添加动态的listview。
同样的,要先在布局文件中加入ViewPager组件,同以上步骤1.
第二步,也是最重要的一步。
前几个操作和以上是一样的,先声明一个LayoutInflater对象:LayoutInflater inflater = getLayoutInflater();获取viewPager组件:
viewPager = (ViewPager) findViewById(R.id.heroPager);创建一个list对象:
viewList = new ArrayList<View>();
这里,我曾经试过如下方法,都是错误的,希望大家引起注意:
直接通过强制类型转换,将View对象转换为ListView对象:
ListView view1 = (ListView) inflater.inflate(R.layout.hero_list, null);
这个方法编译可以通过,但是在运行时系统会报出一个类型转换的错误!
直接通过findViewbyId方法通过listview的组件ID来获取listview对象:
ListView listView1 = (ListView)findViewById(R.id.heroList);
这个方法也是编译时可以通过,运行时在这一步不会出现问题,但是当下面为listview添加SimpleAdpater适配器的时候,会抛出一个空指针异常,调试模式到这一步时,会观察到通过findViewbyId方法得到的listview是一个空对象。
原来findviewById是View这个类中的方法,默认调用时其实应该是:
this.findviewById();
由于上图代码中的R.id.herolist这个listview的声明并不在当前的viewPager所在的xml布局中,所以直接通过findviewById方法是不能得到该listview的实例的。
既然知道了findviewById()原理,那么就好办了!直接先通过LayoutInflater对象来实例化listview所在的布局,然后通过这个view的findviewById方法来获取listview的实例。
View view1 = inflater.inflate(R.layout.hero_list, null);
View view2 = inflater.inflate(R.layout.hero_list, null);
ListView listview1 = view1.findViewById(R.id.heroList);
ListView listview2 = view1.findViewById(R.id.heroList);
注意view对应的布局是hero_list,listview对应的布局是herolist,两者不一样。
也可以简化如下:
ListView listView1 = (ListView) (inflater.inflate(R.layout.hero_list,
null)).findViewById(R.id.heroList);
ListView listView2 = (ListView) (inflater.inflate(R.layout.hero_list, null)).findViewById(R.id.heroList);
剩下的步骤3和步骤4和上文中的一样,重写PagerAdapter类并添加适配器。
不过不要忘了给每一个listview都添加一个适配器,listview添加SimpleAdapter的步骤我相信大家已经很熟悉了,这里就不再详述了,直接上代码:
SimpleAdapter simpleAdapter_Wu = new SimpleAdapter(this, herolist_wu, R.layout.hero_info, new String[]{"heroImage", "heroName"}, new int[]{R.id.heroImage, R.id.heroName}); SimpleAdapter simpleAdapter_Shu = new SimpleAdapter(this, herolist_shu, R.layout.hero_info, new String[]{"heroImage", "heroName"}, new int[]{R.id.heroImage, R.id.heroName}); listView1.setAdapter(simpleAdapter_Wu); listView2.setAdapter(simpleAdapter_Shu);
到这里,就和以上的不一样了!!
LayoutInflater对象的inflater方法只能实例化一个view对象,由于android中不能通过直接将一个xml布局声明为一个Listview,所以就不能直接通过inflater方法来实例listview对象。
这样就成功的将两个listview添加到ViewPager中了,以下是效果图,(水平有限,不知道怎么做动态的效果图)
在刚开始做这个的时候,也在网上搜索过关于在viewPager中添加listview的方法,都没有找到相关的教程,自己摸索了一天终于把它做出来了,这里和大家分享一下,也希望能给需要类似效果的朋友一些帮助。
相关文章推荐
- android的listView如何添加一个ViewPager
- Android ViewPager>Fragment>Listview>addHeaderView添加轮播图隐藏bug
- Aandroid在ViewPager中添加ListView
- Android_ListView头部添加ViewPager,
- Aandroid在ViewPager中添加ListView
- android中listview添加2个headerview显示效果的演示
- Android开发:ListView添加EmptyView的帮助类
- android listview addheaderview viewpager
- android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager
- Android自定义ViewPager(二)——添加ScrollView,事件分发应用
- Android listview viewpager解决冲突 滑动
- Android:双层嵌套ViewPager并添加单击事件
- ListView 添加viewPager为header时,viewPager滑动失去焦点的解决办法
- 【Android】ViewPager实现图片左右滑动播放及添加点击事件
- Android:给ViewPager添加切换效果
- Android HorizontalScrollView 水平滑动 在listview上面动态添加图片
- android 很多应用中用到的 listView + viewPager
- android 很多应用中用到的 listView + viewPager
- ListView添加删除FooterView java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)