《老罗Android第二季》ViewPage

1. ViewPage
 ViewPager能实现左右侧划的效果,要用到PagerAdapter来生成page.
ViewPager通常和Fragment结合起来用,它能方便的支持和管理每个页面的生命周期。主要用到两个类:FragmentPagerAdapter,FragmentStatePageAdatpter.
示例:实现4个界面,每一个界面显示时加载一张图片。
1. Activity
public class MainActivity extends Activity {
private ViewPager viewPager;
/ 加载显示内容
private List<View> content;
/ 加载显示标题
private List<String> title;
private LayoutInflater inflater;
/图片地址
private String[] items = {
		"http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg",
		"http://lh5.ggpht.com/_Z6tbBnE-swM/TB0CryLkiLI/AAAAAAAAVSo/n6B78hsDUz4/s144-c/_DSC3454.jpg",
		"http://lh3.ggpht.com/_GEnSvSHk4iE/TDSfmyCfn0I/AAAAAAAAF8Y/cqmhEoxbwys/s144-c/_MG_3675.jpg",
		"http://lh6.ggpht.com/_Nsxc889y6hY/TBp7jfx-cgI/AAAAAAAAHAg/Rr7jX44r2Gc/s144-c/IMGP9775a.jpg" };
private MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	viewPager = (ViewPager) this.findViewById(R.id.viewpager);
	inflater = LayoutInflater.from(this);
	content = new ArrayList<View>();
	title = new ArrayList<String>();
	for (int i = 1; i <= 4; i++) {
		View view = inflater.inflate(R.layout.item, null);
		content.add(view);
		title.add("图片集" + i);
	}
	adapter = new MyPagerAdapter();
	viewPager.setAdapter(adapter);
	adapter.notifyDataSetChanged();
public class MyPagerAdapter extends PagerAdapter {
	public Object instantiateItem(ViewGroup container, int position) {
		System.out.println("--path-->>" + items[position]);
		View view = content.get(position);
		//定义成final,就能在new ImageDownLoad()中使用这个imageView。
		final ImageView imageView = (ImageView) view
				.findViewById(R.id.imageView1);
		// imageView.setImageBitmap(bm);
		new ImageDownLoad().loadImage(items[position], new ImageCallBack() {
			@Override
			public void getImageContent(Bitmap bitmap) {
				imageView.setImageBitmap(bitmap);
			}
		});
		((ViewPager) container).addView(view);
		return view;
	}
	public CharSequence getPageTitle(int position) {
		return title.get(position);
	}
	public int getCount() {
		return content.size();
	}
	public boolean isViewFromObject(View arg0, Object arg1) {
		//页面划入划出的时候,怎么判断页面和Key是否一致呢?
		return (arg0 == arg1);
	}
	public void destroyItem(ViewGroup container, int position, Object object) {
		// super.destroyItem(container, position, object);
		((ViewPager) container).removeView(content.get(position));
	}
}
其中的activity_main.xml:
<RelativeLayout.......>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pagertitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top" >
        </android.support.v4.view.PagerTitleStrip>
    </android.support.v4.view.ViewPager>
</RelativeLayout>
item.xml中只加入一个  <ImageView>.

2.ImageDownLoad.java
public class ImageDownLoad {
public void loadImage(final String path, final ImageCallBack callBack) {
	final Handler handler = new Handler() {
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
		Bitmap bitmap = (Bitmap) msg.obj;
		callBack.getImageContent(bitmap);
		}
	};
	new Thread(new Runnable() {
	public void run() {
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost httpPost = new HttpPost(path);
		HttpResponse response = null;
		try {
			response = httpClient.execute(httpPost);
		if (response.getStatusLine().getStatusCode() == 200) {
			byte[] data = EntityUtils.toByteArray(response.getEntity());
			Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,data.length);
			Message message = Message.obtain();
			message.obj = bitmap;
			handler.sendMessage(message);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				httpClient.getConnectionManager().shutdown();
			}
		}
	}).start();
}
public interface ImageCallBack {
	public void getImageContent(Bitmap bitmap);
}
}
声明一个接口,给UI界面实现回调的;在一个方法当中,把一个路径及一个接口传进来。在这的内部通过一个Handler及Runnable把图片下下来。

2. ViewPager 与 Fragment实现侧划效果
 要实现的效果:定义4个Fragment,加入到ViewPager中,当左右划动时,能转到相应的页面。
1)在activity_main.xml中加入ViewPager布局,和上面的一样。
     定义4个布局文件,f1.xml .....   f2.xml.  布局中只加入一个ImageView.
2) MainActivity
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
private List<Fragment> items;
private MyFragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	viewPager = (ViewPager) this.findViewById(R.id.pager);
	items = new ArrayList<Fragment>();
	items.add(new Fragment1());
	items.add(new Fragment2());
	items.add(new Fragment3());
	items.add(new Fragment4());
	adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
	viewPager.setAdapter(adapter);
	adapter.notifyDataSetChanged();
}
/**使用FragmentPagerAdapter适配器的时候,他会持久化数据,即使Fragment被系统销毁,数据也是会保存在内存中的
 * 所以不能使用它来加载大量的数据 * 
 * 使用FragmentStatePagerAdapter适配器的时候,他会销毁Fragment仅仅保存Fragment的引用,适合加载一些大量的数据,
 */
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
	public MyFragmentPagerAdapter(FragmentManager fm) {
		super(fm);
	}
	@Override
	public Fragment getItem(int arg0) {
		return items.get(arg0);
	}
	public int getCount() {
		return items.size();
	}
}
}
FragmentPagerAdapter和FragmentStatePageAdatpter用法一样,直接换下名字就可以用。
3)Fragment1
public class Fragment1 extends Fragment {
private final String image_path = "http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg";
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.f1, null);
	final ImageView imageView = (ImageView) view.findViewById(R.id.imageView1);
        new ImageDownLoad().loadImage(image_path, new ImageCallBack() {
			@Override
			public void getImageContent(Bitmap bitmap) {
				imageView.setImageBitmap(bitmap);
			}
		});
		return view;
	}
	@Override
	public void onPause() {
		super.onPause();
	}
}
Fragment2~Fragment4可以是一样的功能,都是下载一张图片。这里ViewPager在一个特点,就是预装载图片。
下载图片的工具类ImageDownLoad.java和上面是一样的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序—— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。 Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行的效果。 Android基础阶段:平台架构特性(JAVA/C) Market/应用程序组件 环境搭建与部署/打包与发布 AVD/DDMS/AAPT 调试与测试 相关资源访问/资源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及深层实现. Android进阶初级:组件Widget/ 菜单Menu/ 布局Layout 详解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL数据库原理, SQLit e /SharedPreferences/File详解 多媒体Audio/Video/Camera 详解 Android进阶高级:蓝牙/WIFI SMS/MMS 应用实现 深层次解析GPS原理,实现LocationManager/LocationProvider 进行定位/跟踪/查找/趋近警告以及Geocoder正逆向编解码等技术细节 2D图形库(Graphics/View)详解 SDCARD/传感器/手势 应用实现 《老罗Android视频教程(第一季)》的视频一共分为15个章节, 涵盖了Android入门、常用UI布局介绍、HTTP编程、 XML与Json数据解析、JDBC与Web编程、常用UI控件、 数据储存与文件操作、对话框、通知、菜单、 LoaderManager异步加载、多线程(AsyncTask与Handler)、 百度地图等十五个模块,一共102集。 本网盘分享章节编号是按照视频更新的先后顺序编号的,具体学习可参考如下章节顺序: 【第一版第一章】老罗Android开发视频--入门介绍(9集) 【第一版第二章】老罗Android开发视频--常用UI布局介绍(5集) 【第一版第三章】老罗Android开发视频--HTTP协议编程(4集) 【第一版第四章】老罗Android开发视频--解析XML数据(3集) 【第一版第五章】老罗Android开发视频--解析JSON数据(4集) 【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗Android开发视频--服务器端Web编程(6集) 【第一版第八章】老罗Android开发视频-常用UI控件(33集) 【第一版第九章】老罗Android开发视频--存储数据和文件(7集) 【第一版第十章】老罗Android开发视频--对话框介绍(4集) 【第一版第十一章】老罗Android开发视频--通知的使用(2集) 【第一版第十二章】老罗Android开发视频--菜单的使用(4集) 【第一版第十三章】老罗Android开发视频--异步加载数据库(2集) 【第一版第十四章】老罗Android开发视频--多线程编程(7集) 【第一版第十五章】老罗Android开发视频--百度地图实战开发(10集)
ViewPager是Android中的一个控件,它可以实现滑动切换多个Fragment或View的功能,常用于实现页面滑动切换、引导页、轮播图等功能。 使用ViewPager需要以下几个步骤: 1.在布局文件中添加ViewPager控件,如下: ```xml <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2.创建Adapter,继承自PagerAdapter或FragmentPagerAdapter,实现getItem()和getCount()方法,如下: ```java public class MyPagerAdapter extends PagerAdapter { private List<View> mViewList; public MyPagerAdapter(List<View> viewList) { mViewList = viewList; } @Override public int getCount() { return mViewList.size(); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { View view = mViewList.get(position); container.addView(view); return view; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView(mViewList.get(position)); } } ``` 3.将Adapter设置给ViewPager,如下: ```java ViewPager viewPager = findViewById(R.id.view_pager); MyPagerAdapter adapter = new MyPagerAdapter(mViewList); viewPager.setAdapter(adapter); ``` 4.(可选)设置ViewPager的滑动监听: ```java viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // 页面滑动过程中的回调 } @Override public void onPageSelected(int position) { // 页面选中时的回调 } @Override public void onPageScrollStateChanged(int state) { // 页面滑动状态变化时的回调 } }); ``` 以上就是使用ViewPager的基本步骤。需要注意的是,ViewPager默认只会加载当前页和左右两侧的页,如果需要预加载更多页,可以使用setOffscreenPageLimit()方法设置预加载页数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值