天天看點

Android ViewPager循環左右自動滑動加載Page

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>
           



繼續閱讀