Android中实现ViewPager左右滑动加载

有没有这么一种情况,想让ViewPager滑动到最左边的时候再次向左滑动时将数据加载在左边,就好像左边有源源不断的数据一样,滑动到最右边再向右滑动时,右边又可以加载出数据,下面我就来慢慢介绍它的做法,Demo有问题的地方还请大家批评指正。


</pre>首先写一个ViewPager每一个Item的布局文件:viewpager_item.xml</p><p><span style="font-size:18px;"></span><pre name="code" class="java"><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:gravity="center"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/abc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

这个就是ViewPager每一个Item的视图,比较简单哈,只有一个文本TextView和ImageView


下面开始为ViewPager写一个自定义的PagerAdapter:MyPagerAdapter.java

package com.example.viewpagertest;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyPagerAdapter extends PagerAdapter {
	private LayoutInflater inflater;
	List<Map<String, String>> lists;

	public MyPagerAdapter(Context context, List<Map<String, String>> lists) {
		inflater = LayoutInflater.from(context);
		this.lists = lists;
	}

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		((ViewPager) container).removeView((View) object);
	}

	@Override
	public void finishUpdate(ViewGroup container) {
	}

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

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		View view = inflater.inflate(R.layout.viewpager_item, container, false);
		TextView text = (TextView) view.findViewById(R.id.abc);
		text.setText(lists.get(position).get("index"));
		((ViewPager) container).addView(view);
		return view;
	}

	@Override
	public boolean isViewFromObject(View view, Object object) {
		// TODO Auto-generated method stub
		return view == object;
	}

}

因为我是在Fragment里面实现的这个功能,所以下面写一个主界面的布局文件,里面有一个LinearLayout是用于放内容的,这个很简单,就是这样哈:activity_main.xml

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/ly"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

下面这个就是要放在上面LinearLayout中的布局文件:f1.xml

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

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

</RelativeLayout>

Ok,到这里就把主界面的Java代码贴出来了哈,只有几句代码:MainActivity.java

public class MainActivity extends Activity {
	FragmentManager manager;
	FragmentTransaction ft;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		manager = getFragmentManager();
		ft = manager.beginTransaction();
		MyFragment fragment = new MyFragment();
		ft.replace(R.id.ly, fragment).commit();

	}

}

到这里一切就绪了,下面这个才是重点的实现的代码,前面的都很简单的,这是一个Fragment,在这里实现viewpager左右滑动的动态加载:MyFragment.java

public class MyFragment extends Fragment {
	private ViewPager viewPager;
	MyPagerAdapter adapter;
	private int fast = 0, page = 1;
	ProgressDialog dialog;
	private List<Map<String, String>> lists;
	private Map<String, String> map;
	private int num = 100;// 缓存条数
	private boolean flag = true;

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

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.f1, container, false);
		init(view);
		return view;
	}

	private boolean isScrolled = false;
	boolean isRight = false;// 向右

	/**
	 * @param view
	 */
	private void init(View view) {
		dialog = new ProgressDialog(getActivity());
		dialog.setCanceledOnTouchOutside(false);
		viewPager = (ViewPager) view.findViewById(R.id.viewpager);
		viewPager.setOnTouchListener(new OnTouchListener() {
			float x = 0;
			float distance;// 移动距离

			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				try {

					int eventAction = arg1.getAction();
					switch (eventAction) {
					case MotionEvent.ACTION_DOWN:// 按下时
						x = arg1.getX();// 记录第一次按下位置
						isScrolled = false;
						break;
					case MotionEvent.ACTION_MOVE:
						// distance = arg1.getX() - x;// 移动距离
						break;
					case MotionEvent.ACTION_UP:
						// Toast.makeText(getActivity(),
						// "arg1" + arg1.getX() + "x" + x, 1).show();
						distance = arg1.getX() - x;// 移动距离
						if (Math.abs(distance) > 170) {// 判断达到滑动标准
							isScrolled = true;
						} else {
							isScrolled = false;
						}
						if (distance > 0) {// 向左滑动
							// Toast.makeText(getActivity(), "向左滑动" + distance,
							// 1)
							// .show();
							isRight = false;
						} else {// 向右滑动
							// Toast.makeText(getActivity(), "向右滑动", 1).show();
							isRight = true;
						}
						break;
					default:
						break;
					}
				} catch (Exception e) {
					// TODO: handle exception
				}
				return false;
			}
		});
		viewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// Toast.makeText(getBaseContext(), "onPageSelected" + arg0 +
				// "",
				// 1).show();
			}

			/*
			 * arg0 :当前页面,及你点击滑动的页面
			 * 
			 * arg1:当前页面偏移的百分比
			 * 
			 * arg2:当前页面偏移的像素位置
			 * 
			 * (int, float, int)
			 */
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
			}

			boolean isLast = true;

			@Override
			public void onPageScrollStateChanged(int i) {
				if (isScrolled) {
					if (i == 2) {
						isLast = false;
					} else if (i == 0 && isLast) {// 最左边加载前一天的数据
						int position = viewPager.getCurrentItem();
						if (position == 0) {// 向左滑动
							if (isRight && lists.size() == 1) {// 判断第一次滑动是否向右
								Toast.makeText(
										getActivity(),
										position + "到右边、有" + lists.size()
												+ "条数据", 1).show();
								Update update = new Update();
								update.execute("页码:" + page++, "1");
							} else {
								Toast.makeText(
										getActivity(),
										position + "到左边了、有" + lists.size()
												+ "条数据", 1).show();
								Update update = new Update();
								update.execute("页码:-" + fast++, "0");
							}
						} else if (position == lists.size() - 1) {// 向右滑动
							Toast.makeText(getActivity(),
									position + "到右边、有" + lists.size() + "条数据",
									1).show();
							Update update = new Update();
							update.execute("页码:" + page++, "1");
						}
					} else {
						isLast = true;
					}
				}
			}
		});
		lists = new ArrayList<Map<String, String>>();
		for (; page <= 1; page++) {
			map = new HashMap<String, String>();
			map.put("index", "页码:" + page);
			lists.add(map);
		}
		adapter = new MyPagerAdapter(getActivity(), lists);
		viewPager.setAdapter(adapter);
		viewPager.setCurrentItem(page + fast);
		// 默认先加载两页数据
		Update update = new Update();
		// update.execute("页码:-" + fast++, "0");
	}

	int max;

	class Update extends BaseAsyncTask {
		private String date;
		private String type;

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			dialog.show();
		}

		@Override
		protected Integer doInBackground(String... params) {
			int resultCode = -1;
			date = params[0];
			type = params[1];
			if (type.equals("0")) {// 左边
				map = new HashMap<String, String>();
				map.put("index", date);
				lists.add(0, map);
				resultCode = 1;
			} else if (type.equals("1")) {// 右边
				map = new HashMap<String, String>();
				map.put("index", date);
				lists.add(map);
				resultCode = 2;
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return resultCode;
		}

		@Override
		protected void onPostExecute(Integer resultCode) {
			super.onPostExecute(resultCode);
			max = page + fast;
			switch (resultCode) {
			case 1:
				if (lists.size() > num) {
					lists.remove(num);
					page--;
				}
				viewPager.setAdapter(adapter);
				dialog.dismiss();
				break;
			case 2:
				if (lists.size() > num) {
					lists.remove(0);
					fast--;
					viewPager.setAdapter(adapter);
				} else {
					adapter.notifyDataSetChanged();
				}
				viewPager.setCurrentItem(max);
				dialog.dismiss();
				break;

			default:
				break;
			}
		}
	}

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

	@Override
	public void onPause() {
		super.onPause();
	}
}


Ok,到这里一切就大功告成了

为了方便大家,我把Demo放在这里了哈http://download.youkuaiyun.com/detail/flymoon1201/8265843

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值