Android应用中使用ViewPager实现类似QQ的界面切换效果

这几天在研究ViewPager,简单的写一下如何使用ViewPager实现类似于QQ的“最近联系人、好友、群组”的界面切换(不知道他们是不是用这个方法实现的)。
ViewPager已经在android-sdk中加入了,具体的位置在%android_sdk_home%\android-compatibility\v4,%android_sdk_home%是你的android-sdk-windows目录。

好,下面放一张效果图:

步骤一:新建一个工程,我的是Viewpager
步骤二:导入jar包
具体如下:
右键工程--Properties--单击左侧Java Build Path--单击右侧Libraries标签--单击右侧Add External Jars--选择上面描述位置的jar包,保存

步骤三:编写一个主界面,加入android.support.v4.view.ViewPager组件

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <android.support.v4.view.ViewPager android:id="@+id/mViewPager" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

步骤四:编写三个要添加进来的界面
界面都很简单,随便写的
界面1

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff0000" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout1" /> </LinearLayout>

界面2

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00ff00" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout2" /> </LinearLayout>

界面3

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#0000ff" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout3" /> </LinearLayout>

步骤五:编写主类,我的名字是叫ViewpagerActivity

package com.carter.viewpager; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import android.app.Activity; import android.app.ActivityGroup; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ViewpagerActivity extends ActivityGroup { /** * 能够支持滑动的组件 */ ViewPager mViewPager; /** * ViewPager 需要设置该Adapter才能实现添加界面, * 该Adapter继承自PagerAdapter */ MyPagerAdapter adapter; /** * 用于保存三个界面 */ List<View> list; /** * 用于生成界面 */ LayoutInflater mInflater; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mInflater = this.getLayoutInflater(); /** * 添加进来三个界面到List,用于初始化PagerAdapter */ list = new ArrayList<View>(); list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); list.add(mInflater.inflate(R.layout.layout2, null)); list.add(mInflater.inflate(R.layout.layout3, null)); mViewPager = (ViewPager)findViewById(R.id.mViewPager); adapter = new MyPagerAdapter(list); mViewPager.setAdapter(adapter); /** * 为ViewPager添加PageChangeListener,在回调的方法中可以完成其他的事情,例如处理一些界面标签的转换之类的,如果你有标签栏的话 */ mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub Log.i("carter", "onPageSelected"); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } class MyPagerAdapter extends PagerAdapter { List<View> mList; public MyPagerAdapter(List<View> list){ mList = list; } @Override public int getCount() { // TODO Auto-generated method stub return mList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == (arg1); } @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub ((ViewPager)container).removeView(mList.get(position)); } @Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(mList.get(position), 0); return mList.get(position); } @Override public void finishUpdate(ViewGroup container) { // TODO Auto-generated method stub super.finishUpdate(container); } } }

代码解读:
1、在上面重写了PagerAdapter,在里面最重要的方法就是

@Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(mList.get(position), 0); return mList.get(position); }

具体为什么每次都是addView到0的位置,目前我还不知道,这个也是从网上找了一个方法看到的。

2、在初始化List的时候,里面包含的内容是一个个的View元素,在我的了解范围内有两种方法
第一种就是通过添加Window的getDecorView()来得到一个View;
第二种就是通过LayoutInflater,从xml中生成一个View。
需要注意的是,第一种方法,需要主类继承自ActivityGroup,这样才能在添加时使用getLocalActivityManager以及之后的方法,需要生成的Activity,例如本例中的Layout1Activity,要在AndroidManifest.xml中声明。

/** * 添加进来三个界面到List,用于初始化PagerAdapter */ list = new ArrayList<View>(); list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); list.add(mInflater.inflate(R.layout.layout2, null)); list.add(mInflater.inflate(R.layout.layout3, null));

3、如果只是从xml生成View来添加的话,完全可以移除继承ActivityGroup。
4、如果使用startActivity的方法来启动,需要添加进来的几个Activity,是一起在加入时就初始化的,可以通过在onCreate()方法中打LOG看出来。

PS:如何解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题
具体讲解如下:
Google在Android 3.0SDK中推出的ViewPager控件很大程度上满足了开发者开发页面左右移动切换的功能,使用非常方便。但是使用中发现,在删除或者修改数据的时候,PagerAdapter无法像BaseAdapter那样仅通过notifyDataSetChanged方法通知刷新View。
最基本的方法:
针对于child view比较简单的情况(例如仅有TextView、ImageView等,没有ListView等展示数据的情况),可以在自己的Adapter中加入代码:

@Override public int getItemPosition(Object object) { return POSITION_NONE; }

这样既可达到一般情况下要求的效果。
存在的问题:
这不是PagerAdapter中的Bug,通常情况下,调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,这种情况下,所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child view内容的时候,造成了完全不必要的开销。
更有效地方法:
更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。

时间: 2024-10-04 10:59:42

Android应用中使用ViewPager实现类似QQ的界面切换效果的相关文章

Android应用中使用ViewPager实现类似QQ的界面切换效果_Android

这几天在研究ViewPager,简单的写一下如何使用ViewPager实现类似于QQ的"最近联系人.好友.群组"的界面切换(不知道他们是不是用这个方法实现的). ViewPager已经在android-sdk中加入了,具体的位置在%android_sdk_home%\android-compatibility\v4,%android_sdk_home%是你的android-sdk-windows目录. 好,下面放一张效果图: 步骤一:新建一个工程,我的是Viewpager 步骤二:导入

Android 桌面图标上显示未读消息的图标(类似qq的桌面提示效果)

问题描述 Android 桌面图标上显示未读消息的图标(类似qq的桌面提示效果) 当有新的消息之后,在桌面上提示出来,在网上找了几天,都是只有几个牌子的手机支持,哪位大神有比较全的. 解决方案 Android 类似未读短信图标显示数字效果的分析Android 类似未读短信图标显示数字效果的分析Android 类似未读短信图标显示数字效果的分析 解决方案二: 没研究过,你可以去github上看看 解决方案三: https://github.com/xuyisheng/ShortcutHelper

JS+CSS实现类似QQ好友及黑名单效果的树型菜单_javascript技巧

本文实例讲述了JS+CSS实现类似QQ好友及黑名单效果的树型菜单.分享给大家供大家参考.具体如下: 今天介绍的这个菜单堪称极品啊,不过里面的有些图标丢失了,路径还留在那,真想使用的朋友自己制作两个折叠菜单的图标按路径传上去就行了,这个菜单是模仿QQ面板的菜单功能,很多朋友还是很喜欢这种功能的,没想到用这么少的JS代码也可实现 ,值得代签哦. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-css-qq-hy-hmd-style-menu-c

javascript简单实现类似QQ头像弹出效果的方法_javascript技巧

本文实例讲述了javascript简单实现类似QQ头像弹出效果的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q

Android使用SwipeListView实现类似QQ的滑动删除效果_Android

QQ的滑动删除效果很不错,要实现这种效果,可以使用SwipeListView. 1. 下载com.fortysevendeg.swipelistview这个项目(以前GitHub上有,现在GitHub上没有了,百度了很多次才下载到的),导入Eclipse,右键单击,选择Properties->Android,选中Library下面的IsLibrary. 2. 新建一个项目MySwipeListView,加入SwipeListView这个库. 3. 在主窗体里面放入一个SwipeListView控

Android App中使用ViewPager+Fragment实现滑动切换效果

在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

Android App中使用ViewPager实现滑动分页的要点解析_Android

以前如果要做 Tab 分页的话,必须要用一个很难用的 TabActivity,而且做出来的效果很差,弹性也很小 忘了从什么时候开始,Google release 了 ViewPager 这好东西取代了以前难用的 Gallery 元件,加上从 Honeycomb 导入的 Fragment 之后终于能够简单做出好看又好用的 Layout 了! 这里我们采用PagerTabStrip ,做出来的效果如下 特色就是使用简单,出来的效果则是目前显示的分页 Tab 的文字会自动置中,然后分别在左右显示上一个

Android应用中使用ViewPager和ViewPager指示器来制作Tab标签_Android

一.ViewPageIndicator开源框架的基本用法 我们先得去Github上面下载这个库,下载地址:https://github.com/JakeWharton/Android-ViewPagerIndicator,下载下来之后你可以运行例子,来看看我们需要什么样的效果,然后在此基础上改成我们自己想要的效果 1.如何使用开源框架第1步:improt library项目 第2步:导入library进我们自己新建的项目 从Github上Download下来这个zip包之后,里面会有一个libr

Android应用中利用ViewPager实现多页面滑动切换效果示例_Android

1.添加android support包因为上面的几个类都是在android support包中才提供,我们先添加包. 在Eclipse->Window->Android SDK Manager,选择列表中Extras->Android Support Library进行安装.下载完后在android-sdk\extras\android\support目录下,这里我们选择v4版本,进入v4目录,拷贝其中的android-support-v4.jar文件到工程的libs目录(若没有新建)