Android ViewPager循环左右自动滑动加载Page

简介: package zhangphil.auto_viewpager;import java.util.ArrayList;import android.

package zhangphil.auto_viewpager;

import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

/**
 * Android ViewPager循环左右自动滑动加载Page。
 *  
 * 核心关键:使用 ViewPager的setCurrentItem(int index)左右自动循环加载。
 * 思路:使用Android Handler,在Handler的handleMessage(Message msg)中收消息,收到消息就从msg中解析出需要加载的索引。
 * 相应的,开辟一个线程,时隔两秒就用Handler发一个Message,触发Handler的handleMessage,从而调用ViewPager的setCurrentItem操作.
 */

public class MainActivity extends ActionBarActivity {

	private ViewPager mViewPager;

	private final static String ID = "id";
	private ArrayList<Fragment> mArrayList;

	// 用以显示的Fragment总数,假设有5个.
	private final int SIZE = 5;

	private Handler handler;
	private final int WHAT = 0xf01;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mArrayList = new ArrayList<Fragment>();
		for (int i = 0; i < SIZE; i++) {
			Fragment f = new TestFragment();
			Bundle b = new Bundle();
			b.putInt(ID, i);
			f.setArguments(b);
			mArrayList.add(f);
		}

		mViewPager = (ViewPager) findViewById(R.id.viewpager);
		FragmentPagerAdapter mPagerAdapter = new MyFragmentPagerAdapter(
				getSupportFragmentManager());
		mViewPager.setAdapter(mPagerAdapter);

		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case WHAT:
					int index = (Integer) msg.obj;
					mViewPager.setCurrentItem(index);
					break;
				}
			}
		};

		new Thread(new Runnable() {

			@Override
			public void run() {

				int i = 0;
				while (true) {
					// 当超过SIZE后,回绕,从头开始循环。
					i = i % SIZE;

					Message message = new Message();
					message.what = WHAT;
					message.obj = i;
					handler.sendMessage(message);

					// 休息两秒。
					SystemClock.sleep(2000);

					i++;
				}
			}
		}).start();
	}

	private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

		public MyFragmentPagerAdapter(FragmentManager fm) {
			super(fm);
		}

		@Override
		public Fragment getItem(int pos) {
			return mArrayList.get(pos);
		}

		@Override
		public int getCount() {
			return mArrayList.size();
		}
	}

	// 测试的Fragmnt,只显示一个Id,用于区别不同的Fragment。
	public static class TestFragment extends Fragment {

		private int Id;

		@Override
		public void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);

			Bundle b = this.getArguments();
			Id = b.getInt(ID);
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {

			TextView tv = new TextView(getActivity());
			String str = "id: " + Id;
			tv.setTextColor(Color.LTGRAY);
			tv.setText(str);
			tv.setTextSize(50);
			tv.setGravity(Gravity.CENTER);

			return tv;
		}
	}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

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


</LinearLayout>


相关文章
|
6月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
181 2
|
3月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
5月前
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
103 2
|
5月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
64 0
|
5月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
52 0
|
7月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
66 2
|
6月前
|
Android开发
Android仿高德首页三段式滑动
Android仿高德首页三段式滑动
181 0
|
7月前
|
编解码 Android开发
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
133 0
|
7月前
|
XML Android开发 UED

热门文章

最新文章