android 应用中,如欢迎指引页面, 和图片轮播功能, 或者更多的内容在一页显示不了,要分成多个页面,这时候viewpager是很好用的。
下面是一个例子,带异步网络加载图片,并带导航小圆点
[AppleScript] 纯文本查看 复制代码
package com.example.viewpagertest;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.viewpagertest.MainActivity.AsyncImageLoader.ImageCallback;
/***
*
* 说明:ViewPager ,带小圆点导航,适配器采用PagerAdapter,基本可以满足需求
* 也可以采用FragmentPagerAdapter,有人说,Fragment可以更好的适应平板和手机,
* 并且可以更好的代码重用,具体这些好处大家试一下就知道了。
*
* @author andylaw
*
* 更多内容请查看博客:http://blog.csdn.net/lyc66666666666
*
*/
@SuppressLint("NewApi")
public class MainActivity extends Activity {
private ViewPager view_pager;
private LayoutInflater inflater;
// 图片的地址,这里可以从服务器获取
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"
};
private ImageView image;
private View item ;
private MyAdapter adapter ;
private ImageView[] indicator_imgs = new ImageView[7];//存放引到图片数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view_pager = (ViewPager) findViewById(R.id.view_pager);
List<view> list = new ArrayList<view>();
inflater = LayoutInflater.from(this);
/**
* 创建多个item (每一条viewPager都是一个item)
* 从服务器获取完数据(如文章标题、url地址) 后,再设置适配器
*/
for (int i = 0; i < 7; i++) {
item = inflater.inflate(R.layout.item, null);
((TextView) item.findViewById(R.id.text_view)).setText("第 " + i+ " 个 viewPager");
list.add(item);
}
//创建适配器, 把组装完的组件传递进去
adapter = new MyAdapter(list);
view_pager.setAdapter(adapter);
//绑定动作监听器:如翻页的动画
view_pager.setOnPageChangeListener(new MyListener());
initIndicator();
}
/**
* 初始化引导图标
* 动态创建多个小圆点,然后组装到线性布局里
*/
private void initIndicator(){
ImageView imgView;
View v = findViewById(R.id.indicator);// 线性水平布局,负责动态调整导航图标
for (int i = 0; i < 7; i++) {
imgView = new ImageView(this);
LinearLayout.LayoutParams params_linear = new LinearLayout.LayoutParams(10,10);
params_linear.setMargins(7, 10, 7, 10);
imgView.setLayoutParams(params_linear);
indicator_imgs[i] = imgView;
if (i == 0) { // 初始化第一个为选中状态
indicator_imgs[i].setBackgroundResource(R.drawable.indicator_focused);
} else {
indicator_imgs[i].setBackgroundResource(R.drawable.indicator);
}
((ViewGroup)v).addView(indicator_imgs[i]);
}
}
/**
* 适配器,负责装配 、销毁 数据 和 组件 。
*/
private class MyAdapter extends PagerAdapter {
private List<view> mList;
private AsyncImageLoader asyncImageLoader;
public MyAdapter(List<view> list) {
mList = list;
asyncImageLoader = new AsyncImageLoader();
}
/**
* Return the number of views available.
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return mList.size();
}
/**
* Remove a page for the given position.
* 滑动过后就销毁 ,销毁当前页的前一个的前一个的页!
* instantiateItem(View container, int position)
* This method was deprecated in API level . Use instantiateItem(ViewGroup, int)
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(mList.get(position));
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
/**
* Create the page for the given position.
*/
@Override
public Object instantiateItem(final ViewGroup container, final int position) {
Drawable cachedImage = asyncImageLoader.loadDrawable(
urls[position], new ImageCallback() {
public void imageLoaded(Drawable imageDrawable,
String imageUrl) {
View view = mList.get(position);
image = ((ImageView) view.findViewById(R.id.image));
image.setBackground(imageDrawable);
container.removeView(mList.get(position));
container.addView(mList.get(position));
// adapter.notifyDataSetChanged();
}
});
View view = mList.get(position);
image = ((ImageView) view.findViewById(R.id.image));
image.setBackground(cachedImage);
container.removeView(mList.get(position));
container.addView(mList.get(position));
// adapter.notifyDataSetChanged();
return mList.get(position);
}
}
/**
* 动作监听器,可异步加载图片
*
*/
private class MyListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
if (state == 0) {
//new MyAdapter(null).notifyDataSetChanged();
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// 改变所有导航的背景图片为:未选中
for (int i = 0; i < indicator_imgs.length; i++) {
indicator_imgs[i].setBackgroundResource(R.drawable.indicator);
}
// 改变当前背景图片为:选中
indicator_imgs[position].setBackgroundResource(R.drawable.indicator_focused);
}
}
/**
* 异步加载图片
*/
static class AsyncImageLoader {
// 软引用,使用内存做临时缓存 (程序退出,或内存不够则清除软引用)
private HashMap<string, softreference<drawable="">> imageCache;
public AsyncImageLoader() {
imageCache = new HashMap<string, softreference<drawable="">>();
}
/**
* 定义回调接口
*/
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
}
/**
* 创建子线程加载图片
* 子线程加载完图片交给handler处理(子线程不能更新ui,而handler处在主线程,可以更新ui)
* handler又交给imageCallback,imageCallback须要自己来实现,在这里可以对回调参数进行处理
*
* @param imageUrl :须要加载的图片url
* @param imageCallback:
* @return
*/
public Drawable loadDrawable(final String imageUrl,
final ImageCallback imageCallback) {
//如果缓存中存在图片 ,则首先使用缓存
if (imageCache.containsKey(imageUrl)) {
SoftReference<drawable> softReference = imageCache.get(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);
// 下载完的图片放到缓存里
imageCache.put(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;
}
//清除缓存
public void clearCache() {
if (this.imageCache.size() > 0) {
this.imageCache.clear();
}
}
}
}
下面是每一条item文件:
[AppleScript] 纯文本查看 复制代码 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" android:orientation="vertical">
<textview android:id="@+id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content">
<imageview android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content">
</imageview></textview></linearlayout>
|