有没有这么一种情况,想让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
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();
}
}
为了方便大家,我把Demo放在这里了哈http://download.youkuaiyun.com/detail/flymoon1201/8265843