`
473687880
  • 浏览: 535921 次
文章分类
社区版块
存档分类
最新评论

Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

 
阅读更多

大家好,相信大家用的ListView控件一定很多的,是竖向滑动的,复用convertView,我们可以加载成千上万的数据,但有时候我们会有这个需求比如相册,我们想横向滑动,并且数据有好多,这时候ViewPager控件就派上用场了,ViewPager使用时候我们需要导入第三方包android-support-v4.jar包,这是谷歌提供的,这个包里有Fragment ViewPager等控件,用户导入这个包,在3.0以前就可以使用Fragment控件了~

下面就开始讲下ViewPager的用法,ViewPager和ViewFlipper用法类似,但是更好用,左右滑动效果好,而且有类似于ListView的Adapter---PagerAdapter基类,这样的话可以回收内存,复用等。PagerAdapter的几个方法里常用的有:

void destroyItem(View container, int position, Object object) 

这里是左右滑动的时候,回收较早前的itemView.

int getCount() 
ViewPager里显示内容的条数.

 Object instantiateItem(View container, int position)
初始化ItemView.

为了让大家容易掌握,我写了一个简单的例子,简单实现相册横向滑动功能,首先自定义了ViewPager的itemView----ViewPagerItemView,这里做了初始化View的定义,以及回收内存重新加载等,数据源是JSONObject.其次是实现了PagerAdapter的适配器ViewPagerAdater,这里的数据源是JSONArray.然后ViewPager在名为ViewPagerDemoActivity.java的Activity里显示。下面是具体实现步骤:

第一步:新建一个Android工程ViewPagerDemoActivity,目录结构如下图所示:

第二步:新建一个ViewPagerItemView.java这里是相册的ItemView,代码如下:

package com.tutor.viewpager;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @author frankiewei
 * 相册的ItemView,自定义View.方便复用.
 */
public class ViewPagerItemView extends FrameLayout {

	/**
	 * 图片的ImageView.
	 */
	private ImageView mAlbumImageView;
	
	/**
	 * 图片名字的TextView.
	 */
	private TextView mALbumNameTextView;
	
	/**
	 * 图片的Bitmap.
	 */
	private Bitmap mBitmap;
	
	/**
	 * 要显示图片的JSONOBject类.
	 */
	private JSONObject mObject;
	
	
	public ViewPagerItemView(Context context){
		super(context);
		setupViews();
	}
	
	public ViewPagerItemView(Context context, AttributeSet attrs) {
		super(context, attrs);
		setupViews();
	}
	
	//初始化View.
	private void setupViews(){
		LayoutInflater inflater = LayoutInflater.from(getContext());
		View view = inflater.inflate(R.layout.viewpager_itemview, null);
		
		mAlbumImageView = (ImageView)view.findViewById(R.id.album_imgview);
		mALbumNameTextView = (TextView)view.findViewById(R.id.album_name); 
		addView(view);
	}

	/**
	 * 填充数据,共外部调用.
	 * @param object
	 */
	public void setData(JSONObject object){
		this.mObject = object;
		try {
			int resId = object.getInt("resid");
			String name = object.getString("name");
			//实战中如果图片耗时应该令其一个线程去拉图片异步,不然把UI线程卡死.
			mAlbumImageView.setImageResource(resId);
			mALbumNameTextView.setText(name);
		} catch (JSONException e) {
			e.printStackTrace();
		}
		
	}
		
	/**
	 * 这里内存回收.外部调用.
	 */
	public void recycle(){
		mAlbumImageView.setImageBitmap(null);
		if ((this.mBitmap == null) || (this.mBitmap.isRecycled()))
			return;
		this.mBitmap.recycle();
		this.mBitmap = null;
	}
	
	
	/**
	 * 重新加载.外部调用.
	 */
	public void reload(){
		try {
			int resId = mObject.getInt("resid");
			//实战中如果图片耗时应该令其一个线程去拉图片异步,不然把UI线程卡死.
			mAlbumImageView.setImageResource(resId);
		}catch (JSONException e) {
			e.printStackTrace();
		}
	}
	
}

其中ViewPagerItemView使用的xml文件viewpager_itemView.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
	<ImageView 
	    android:id="@+id/album_imgview"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:contentDescription="@string/app_name"
	    android:scaleType="fitXY"
	    />
	
	<TextView
	    android:id="@+id/album_name"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_gravity="bottom|center_horizontal" 
	    android:textColor="#B2191919"
	    />
</FrameLayout>

第三步:新建一个ViewPagerAdapter.java继承与PagerAdapter,代码如下:
package com.tutor.viewpager;

import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

/**
 * @author frankiewei
 * 相册的适配器.
 */
public class ViewPagerAdapter extends PagerAdapter {

	/**
	 * 上下文
	 */
	private Context mContext;
	
	/**
	 * 数据源,这里是JSONARRAY
	 */
	private JSONArray mJsonArray;
	
	/**
	 * Hashmap保存相片的位置以及ItemView.
	 */
	private HashMap<Integer, ViewPagerItemView> mHashMap;
	
	public ViewPagerAdapter(Context context,JSONArray arrays) {
		this.mContext = context;
		this.mJsonArray = arrays;
		mHashMap = new HashMap<Integer, ViewPagerItemView>();
	}
	
	//这里进行回收,当我们左右滑动的时候,会把早期的图片回收掉.
	@Override
	public void destroyItem(View container, int position, Object object) {
		ViewPagerItemView itemView = (ViewPagerItemView)object;
		itemView.recycle();
	}
	
	@Override
	public void finishUpdate(View view) {

	}

	//这里返回相册有多少条,和BaseAdapter一样.
	@Override
	public int getCount() {
		return mJsonArray.length();
	}

	//这里就是初始化ViewPagerItemView.如果ViewPagerItemView已经存在,
	//重新reload,不存在new一个并且填充数据.
	@Override
	public Object instantiateItem(View container, int position) {	
		ViewPagerItemView itemView;
		if(mHashMap.containsKey(position)){
			itemView = mHashMap.get(position);
			itemView.reload();
		}else{
			itemView = new ViewPagerItemView(mContext);
			try {
				JSONObject dataObj = (JSONObject) mJsonArray.get(position);
				itemView.setData(dataObj);
			} catch (JSONException e) {
				e.printStackTrace();
			}
			mHashMap.put(position, itemView);
			((ViewPager) container).addView(itemView);
		}
		
		return itemView;
	}

	@Override
	public boolean isViewFromObject(View view, Object object) {
		return view == object;
	}

	@Override
	public void restoreState(Parcelable arg0, ClassLoader arg1) {
		
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	@Override
	public void startUpdate(View view) {

	}
}

第四步:修改主Activity类ViewPagerDemoActivity.java代码如下:
package com.tutor.viewpager;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;

/**
 * @author frankiewei
 * ViewPager控件使用的Demo.
 */
public class ViewPagerDemoActivity extends Activity {
	
	/**
	 * 这里定义了相册的总数100条.
	 */
	private static final int ALBUM_COUNT = 100;
	
	/**
	 * 相册的资源,实战开发中都是网络数据或者本地相册.
	 */
	private static final int ALBUM_RES[] = {
		R.drawable.test1,R.drawable.test2,R.drawable.test3,
		R.drawable.test4,R.drawable.test5,R.drawable.test6
	};
    
	private ViewPager mViewPager;
	
	/**
	 * 适配器.
	 */
	private ViewPagerAdapter mViewPagerAdapter;
	
	/**
	 * 数据源.
	 */
	private JSONArray mJsonArray;
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        setupViews();
    }
    
    private void setupViews(){    
    	//初始化JSonArray,给ViewPageAdapter提供数据源用.
    	mJsonArray = new JSONArray();
    	for(int i = 0;i<ALBUM_COUNT; i++){
    		JSONObject object = new JSONObject();
    		try {
				object.put("resid", ALBUM_RES[i % ALBUM_RES.length]);
				object.put("name", "Album " + i);
	    		mJsonArray.put(object);
			} catch (JSONException e) {
				e.printStackTrace();
			}
    		
    	}    	
    	mViewPager = (ViewPager)findViewById(R.id.viewpager);
    	mViewPagerAdapter = new ViewPagerAdapter(this, mJsonArray);
    	mViewPager.setAdapter(mViewPagerAdapter);
    }
}

其中main.xml布局代码如下:

<?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" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         />

</LinearLayout>

第五步运行查看效果:


运行效果1 运行效果2

OK,今天就写到这里,代码注释写的也比较清楚,大家有什么疑问的,可以留言!下面的链接是源代码,供新手们学习用,今天就讲到这里,谢谢大家!!!

源代码点击进入==>

分享到:
评论

相关推荐

    android viewpager android-support-v4.jar

    ViewPager是Android SDK中用于实现页面滑动效果的控件,常见于应用的导航栏或者展示多个横向可滑动内容的场景。Android Support Library v4则是一个重要的库,它提供了对早期Android版本的支持,让开发者可以使用...

    Android-一个多重嵌套:SwipRefreshLayout->RecyclerView->ViewPager->RecyclerView

    在Android开发中,构建复杂且交互丰富的用户界面是常见的需求,而`SwipRefreshLayout`、`RecyclerView`以及`ViewPager`都是Android SDK提供的强大组件,它们各自解决了不同的UI设计问题。当我们需要在一个应用中同时...

    ListView嵌入ViewPager等横向滚动控件冲突的终究解决方案

    在Android开发中,ListView和ViewPager是两种常用的控件,ListView用于显示列表数据,而ViewPager则用于实现页面的左右滑动切换。然而,在实际应用中,当我们尝试将ListView嵌入到一个可以横向滚动的布局(如...

    Android 使用ViewPager实现view轮播效果,单个item分页样式,多个item分页样式,横向listview

    本教程将详细讲解如何使用ViewPager实现view的轮播效果,包括单个item分页样式和多个item分页样式,并探讨如何将ViewPager与横向ListView相结合。 首先,我们需要理解ViewPager的基本概念。ViewPager是Android ...

    ViewPager嵌套GridView实现横向滑动效果

    在Android开发中,有时我们需要创建一个可横向滑动的界面,展示多个子页面,每个页面包含多行数据。在这种情况下,可以使用`ViewPager`和`GridView`的组合来实现这样的功能。`ViewPager`通常用于实现左右滑动切换...

    HorizontalScrollView ViewPager 导航菜单横向左右滑动并和下方的控件实现联动

    在Android开发中,创建一个可滑动的导航菜单通常是实现用户友好界面的重要组成部分。HorizontalScrollView和ViewPager是两个常用的组件,可以用来实现这种效果。本文将深入探讨如何利用这两个组件来构建一个横向左右...

    Android-横向滚动无限循环的图片使用自定义控件的方式

    在Android开发中,为了实现一个横向滚动且无限循环的图片展示功能,我们通常需要自定义一个控件。这种效果常见于广告轮播图或者图片滑动展示等场景,能够为用户带来良好的交互体验。本文将深入讲解如何通过自定义...

    android GridView+ViewPager

    在Android开发中,GridView和ViewPager是两种非常常用的布局控件,它们可以用来构建丰富的用户界面。GridView主要用于展示数据集,通常以网格形式排列,而ViewPager则用于实现页面间的滑动切换,提供平滑的触控体验...

    Android最流行的UI实现:viewpager里面动态的加载fragment

    ViewPager是Android Support Library中的一个控件,它提供了平滑滚动的效果,通常用于展示一系列可横向滑动的页面。这个组件特别适合构建多标签或者卡片式布局,尤其是在平板电脑或大屏幕设备上。 Fragment是...

    ViewPager滑动Demo

    ViewPager是Android平台上一个非常重要的控件,主要用于展示多个页面并实现平滑的左右滑动切换效果。在Android应用开发中,ViewPager通常用于实现如引导页(Onboarding)、图片轮播、菜单滑动切换等场景。在...

    Android高级应用源码-Android高仿广告条用ViewPager实现左右完美无限滑动.rar

    1. **ViewPager组件**:ViewPager是Android SDK中的一个强大控件,主要用于展示可滑动的页面。它可以自动管理页面的加载和缓存,为用户提供流畅的横向滑动体验。在广告条中,ViewPager可以用来显示一系列的广告图片...

    android_pager_adapters,为viewpager移植的适配器允许同时使用android框架和支持开发方法。.zip

    ViewPager是Android Support Library中的一个控件,它允许用户通过横向滑动来浏览一系列的页面。每个页面通常由一个Fragment或一个View实例表示。ViewPager的使用可以提高用户体验,因为它提供了平滑的页面切换效果...

    继承ViewGroup自定义ViewPager

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。`ViewGroup`是Android UI组件的基础,它作为容器可以包含多个`View`或`ViewGroup`,形成了我们看到的各种复杂的布局。`ViewPager`则是一种常见的...

    安卓图片轮播广告轮播自动滚屏相关-Android高仿广告条用ViewPager实现左右完美无限滑动.zip

    本项目“安卓图片轮播广告轮播自动滚屏相关-Android高仿广告条用ViewPager实现左右完美无限滑动”就是针对这一需求提供的一种解决方案。通过使用ViewPager,我们可以实现平滑的左右滑动效果,同时支持自动滚屏,让...

    使用自定义 LayoutManager 实现 Android 中 Gallery 或者 ViewPager 控件的效果

    在Android开发中,`Gallery`和`ViewPager`是两种常用的视图滑动组件。`Gallery`已经在较新的Android版本中被弃用,而`ViewPager`则成为实现页面滑动的主流选择。然而,有时我们可能需要自定义更复杂的滑动效果,这时...

    viewpager使用

    ViewPager是Android平台中一个强大的视图滑动组件,主要用于展示多个可以横向滑动的页面,常用于实现诸如轮播图、应用引导页或者在主界面中切换不同内容区域的效果。在本篇中,我们将深入探讨ViewPager的基本使用...

    viewpager和fragment 搭配使用

    在Android开发中,ViewPager和Fragment是两个非常重要的组件,它们常被用来实现界面的滑动切换和模块化设计。下面将详细阐述这两者如何搭配使用,以及相关的知识点。 首先,ViewPager是一个可以展示多个页面并允许...

    Android高级应用源码-viewpager+Fragment.rar

    `ViewPager`是Android Support Library中的一个控件,它允许用户通过横向滑动来浏览一系列的页面。每个页面通常由一个`Fragment`表示,这样可以使得应用程序更加灵活,因为`Fragment`可以在不同的活动中复用。`...

    开源中国源码学习UI篇(三)之ViewPager+Fragment的使用分析

    `ViewPager`是Android Support Library中的一个控件,它提供了一个可以横向滑动的视图容器。`ViewPager`通常用于展示一系列相互关联的页面,例如在一个应用的主界面中,用户可以通过左右滑动来切换不同的功能模块。`...

    Android 自定义布局竖向的ViewPager的实现

    在Android开发中,有时我们需要创建一个特殊的用户界面,例如实现一个竖向的ViewPager。传统的ViewPager是横向滑动的,但通过自定义布局,我们可以让它在垂直方向上进行滑动。以下是如何实现Android自定义布局竖向...

Global site tag (gtag.js) - Google Analytics