我们已经用viewpager该。 github那里viewpager扩展,导航风格更丰富。这个开源项目ViewPagerIndicator。非常好用,但样品是比较简单,实际用起来是非常不延长。例如,在fragment里进行图片缓存和图片异步载入。

以下是ViewPagerIndicator源代码执行后的效果。大家也都看过了,我多此一举截几张图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

下载源代码请点击这里

===========================================华丽的切割线========================================

以下是我改装过的,可异步载入图片,可图片缓存:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHljNjY2NjY2NjY2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

看到美女你心动了没有呢?

package com.example.viewpagerindicatortest;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import com.viewpagerindicator.TabPageIndicator; /**
* 基于Fragment的Tab样式的viewpager;
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
public class SampleTabsDefault extends FragmentActivity { //tab标题
private static final String[] CONTENT = new String[] { "Recent", "Artists", "Albums", "Songs", "Playlists", "Genres" ,"test"}; private List<SubFragment> list = new ArrayList<SubFragment>(); String[] urls = new String[] { "http://a.hiphotos.baidu.com/image/pic/item/3bf33a87e950352ad6465dad5143fbf2b2118b6b.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/c8177f3e6709c93d002077529d3df8dcd0005440.jpg",
"http://f.hiphotos.baidu.com/image/pic/item/7aec54e736d12f2ecc3d90f84dc2d56285356869.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/9c16fdfaaf51f3de308a87fc96eef01f3a297969.jpg",
"http://d.hiphotos.baidu.com/image/pic/item/f31fbe096b63f624b88f7e8e8544ebf81b4ca369.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/11385343fbf2b2117c2dc3c3c88065380cd78e38.jpg",
"http://c.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5ed8456c2d2eb9389b506b38.jpg" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_tabs); /*
* 初始化:组装多个fragment
* 第一次创建subfragment不会运行onCreateView方法
*/
for (int i = 0; i < 7; i++) { SubFragment fragment =new SubFragment(urls[i]);
list.add(fragment);
} ViewPager pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(new MyAdapter(getSupportFragmentManager(),list));//设置适配器 TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);// } /**
* FragmentPagerAdapter用来适配Fragment
*/
class MyAdapter extends FragmentPagerAdapter { List<SubFragment> mList; public MyAdapter(FragmentManager fm,List<SubFragment> list) {
super(fm);
mList = list;
} /**
* FragmentPagerAdapter初始化item的时候会调用一次getItem。
* 而第二次返回item则不调用getItem方法,而是运行SubFragment的onCreateView方法。
* 也就是说仅仅有在与fragment关联的时候会调用一次getItem,以后则不调用;
*/
@Override
public Fragment getItem(int position) { return mList.get(position); } /*
* 返回title
*/
@Override
public CharSequence getPageTitle(int position) {
return CONTENT[position % CONTENT.length].toUpperCase();
} /*
* 返回总页数
*/
@Override
public int getCount() {
return mList.size();
} } }

package com.example.viewpagerindicatortest;

import java.io.IOException;
import java.lang.ref.SoftReference; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames; import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; /**
* 基于Fragment的Tab样式的viewpager;
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
@SuppressLint("ValidFragment")
public class SubFragment extends Fragment { private static final String KEY_CONTENT = "TestFragment:Content"; private String mContent = "? ?? "; private String url; public SubFragment(String url) { this.url = url;
System.out.println("url:"+url); }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
mContent = savedInstanceState.getString(KEY_CONTENT);
}
} View v ; /**
* 每次翻页都会调用onCreateView创建一次组件
*/
@Override
public View onCreateView(LayoutInflater inflater,
final ViewGroup container, Bundle savedInstanceState) { v = inflater.inflate(R.layout.test, null); new AsyncImageLoader().loadDrawable(url, new ImageCallback() { @SuppressLint("NewApi")
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
System.out.println("图片获取完毕"); ImageView image = (ImageView) v.findViewById(R.id.img);
image.setBackground(imageDrawable); }
}); return v;
} /**
* 定义回调接口
*/
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
} /**
* 异步载入图片
*/
static class AsyncImageLoader { Global global; public AsyncImageLoader() {
global = Global.getInstance();
} /**
* 创建子线程载入图片
* 子线程载入完图片交给handler处理(子线程不能更新ui,而handler处在主线程,能够更新ui)
* handler又交给imageCallback,imageCallback需要自己来实现。在这里能够对回调參数进行处理
*
* @param imageUrl :需要载入的图片url
* @param imageCallback:
* @return
*/
public Drawable loadDrawable(final String imageUrl,
final ImageCallback imageCallback) { //假设缓存中存在图片 ,则首先使用缓存
if (global.getCache(imageUrl)!=null) {
System.out.println("存在缓存~~~~~~~~~~~~~~~~~");
SoftReference<Drawable> softReference = global.getCache(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
imageCallback.imageLoaded(drawable, imageUrl);//运行回调
return drawable;
}
} /**
* 在主线程里运行回调。更新视图
*/
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
}
}; /**
* 创建子线程訪问网络并载入图片 ,把结果交给handler处理
*/
new Thread() {
@Override
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
// 下载完的图片放到缓存里
global.setCache(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}.start(); return null;
} /**
* 下载图片 (注意HttpClient 和httpUrlConnection的差别)
*/
public Drawable loadImageFromUrl(String url) { try {
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000*15);
HttpGet get = new HttpGet(url);
HttpResponse response; response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity(); Drawable d = Drawable.createFromStream(entity.getContent(),
"src"); return d;
} else {
return null;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return null;
} } @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_CONTENT, mContent);
} }

package com.example.viewpagerindicatortest;

import java.lang.ref.SoftReference;
import java.util.HashMap; import android.graphics.drawable.Drawable; /**
* 全局变量。以软引用方式存放图片缓存
*
* @author andy
*
* 很多其它详情请訪问博客:http://blog.csdn.net/lyc66666666666
*/
public class Global { // 软引用,使用内存做暂时缓存 (程序退出,或内存不够则清除软引用)
private static HashMap<String, SoftReference<Drawable>> imageCache; private static Global global; public static Global getInstance() { if (global == null) {
global = new Global();
} if (imageCache == null) {
imageCache = new HashMap<String, SoftReference<Drawable>>();
} return global; } //存放缓存
public void setCache(String url, SoftReference<Drawable> softReference) { imageCache.put(url, softReference); } //获取缓存
public SoftReference<Drawable> getCache(String url) { return imageCache.get(url); } //清除缓存
public void clearCache() {
if (imageCache.size() > 0) {
imageCache.clear();
}
} }

simple_tabs.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 Jake Wharton Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
/> </LinearLayout>

test.xml

<?

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/img"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /> </LinearLayout>

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?

>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.viewpagerindicatortest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <activity
android:name=".SampleTabsDefault"
android:label="@string/app_name"
android:theme="@style/Theme.PageIndicatorDefaults">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

点击下载源代码

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)的更多相关文章

  1. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...

  2. Android学习笔记(二)之异步加载图片

    最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存 ...

  3. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  4. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

  5. 【Android】纯代码创建页面布局(含异步加载图片)

    开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...

  6. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  7. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  8. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  9. Android之使用Android-AQuery异步加载图片(一)

    第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...

随机推荐

  1. hdu2126(求方案数的01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...

  2. hdu1561(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:n座城堡,每个里面都有宝物,要求在你可以攻占m个城堡得到的最多的宝物,但是如果要攻破一个城 ...

  3. PSU 离11.2.0.3.0 -&gt; 11.2.0.3.11 如果解决冲突的整个

    Oracle rdbms 扑灭psu离11.2.0.3.0升级到11.2.0.3.11 参考patch :18522512 停止应用,停止听音乐并DB,将db的oracle_home在下面OPatch ...

  4. JAVA取整以及四舍五入

    JAVA取整以及四舍五入 import java.math.BigDecimal; //引入这个包 public class Test { public static void main(String ...

  5. 程序猿进化 - 在拉钩子1024对APE节讲座计划

    注意:下面这篇文章来自于我在网上拉勾1024对APE节现场演示程序. 我是蒋宇捷,信天创投的合伙人.之前是百度魔图的联合创始人. 我先做个自我介绍,事实上每次介绍自己事实上是非常痛苦的事情,由于我前不 ...

  6. ecshop网站建设手机版wap版出现lib.debug.php on line 303

    首先我们可以看到页面中提示\includes\lib.debug.php on line 303这样的错误,那么我们首先应该找到这个文件的低303行.代码是: $pa = &new Print ...

  7. ASP.NET Core MVC Hello World

    ASP.NET Core 现在ASP.NET Core还在不断成长.更新中,说不定到了明天又换了个模样,就如同一个小孩,从蹒跚学步,到奔向未来. 所以我们可以相应的去理解更新中所发生的变化,包容它.呵 ...

  8. Ubuntu 组态 Tomcat而每天的错误解决

    统环境:Ubuntu 14.10 安装版本号:apache-tomcat-7.0.54.tar.gz 安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.54.tar.gz ...

  9. HDOJ 2665 Kth number

    静态区间第K小....划分树裸题 Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  10. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...