android左右滑动加载分页以及动态加载数据
如图:
- package cn.anycall.ju;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.content.ActivityNotFoundException;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ResolveInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.Window;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.GridView;
- import android.widget.Toast;
- import cn.anycall.ju.ScrollLayout.OnScreenChangeListenerDataLoad;
- /**
- * GridView分页显示安装的应用程序
- */
- public class AllAppList extends Activity {
- private ScrollLayout mScrollLayout;
- private static final float APP_PAGE_SIZE = 4.0f;
- private Context mContext;
- private PageControlView pageControl;
- public MyHandler myHandler;
- public int n=0;
- private DataLoading dataLoad;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- mContext = this;
- setContentView(R.layout.main);
- dataLoad = new DataLoading();
- mScrollLayout = (ScrollLayout)findViewById(R.id.ScrollLayoutTest);
- myHandler = new MyHandler(this,1);
- //起一个线程更新数据
- MyThread m = new MyThread();
- new Thread(m).start();
- }
- /**
- * gridView 的onItemLick响应事件
- */
- public OnItemClickListener listener = new OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- // TODO Auto-generated method stub
- System.out.println("position="+position);
- }
- };
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- android.os.Process.killProcess(android.os.Process.myPid());
- super.onDestroy();
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- finish();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
- // 更新后台数据
- class MyThread implements Runnable {
- public void run() {
- try {
- Thread.sleep(1000*3);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String msglist = "1";
- Message msg = new Message();
- Bundle b = new Bundle();// 存放数据
- b.putString("rmsg", msglist);
- msg.setData(b);
- AllAppList.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
- }
- }
- class MyHandler extends Handler {
- private AllAppList mContext;
- public MyHandler(Context conn,int a) {
- mContext = (AllAppList)conn;
- }
- public MyHandler(Looper L) {
- super(L);
- }
- // 子类必须重写此方法,接受数据
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Bundle b = msg.getData();
- String rmsg = b.getString("rmsg");
- if ("1".equals(rmsg)) {
- // do nothing
- List<Map> list = new ArrayList<Map>();
- for(int i =0;i<16;i++){
- n++;
- Map map = new HashMap();
- map.put("name", n);
- list.add(map);
- }
- int pageNo = (int)Math.ceil( list.size()/APP_PAGE_SIZE);
- for (int i = 0; i < pageNo; i++) {
- GridView appPage = new GridView(mContext);
- // get the "i" page data
- appPage.setAdapter(new AppAdapter(mContext, list, i));
- appPage.setNumColumns(2);
- appPage.setOnItemClickListener(listener);
- mScrollLayout.addView(appPage);
- }
- //加载分页
- pageControl = (PageControlView) findViewById(R.id.pageControl);
- pageControl.bindScrollViewGroup(mScrollLayout);
- //加载分页数据
- dataLoad.bindScrollViewGroup(mScrollLayout);
- }
- }
- }
- //分页数据
- class DataLoading {
- private int count;
- public void bindScrollViewGroup(ScrollLayout scrollViewGroup) {
- this.count=scrollViewGroup.getChildCount();
- scrollViewGroup.setOnScreenChangeListenerDataLoad(new OnScreenChangeListenerDataLoad() {
- public void onScreenChange(int currentIndex) {
- // TODO Auto-generated method stub
- generatePageControl(currentIndex);
- }
- });
- }
- private void generatePageControl(int currentIndex){
- //如果到最后一页,就加载16条记录
- if(count==currentIndex+1){
- MyThread m = new MyThread();
- new Thread(m).start();
- }
- }
- }
- }
- package cn.anycall.ju;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.content.ActivityNotFoundException;
- import android.content.Context;
- import android.content.Intent;
- import android.content.pm.ResolveInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.Window;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.GridView;
- import android.widget.Toast;
- import cn.anycall.ju.ScrollLayout.OnScreenChangeListenerDataLoad;
- /**
- * GridView分页显示安装的应用程序
- */
- public class AllAppList extends Activity {
- private ScrollLayout mScrollLayout;
- private static final float APP_PAGE_SIZE = 4.0f;
- private Context mContext;
- private PageControlView pageControl;
- public MyHandler myHandler;
- public int n=0;
- private DataLoading dataLoad;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- mContext = this;
- setContentView(R.layout.main);
- dataLoad = new DataLoading();
- mScrollLayout = (ScrollLayout)findViewById(R.id.ScrollLayoutTest);
- myHandler = new MyHandler(this,1);
- //起一个线程更新数据
- MyThread m = new MyThread();
- new Thread(m).start();
- }
- /**
- * gridView 的onItemLick响应事件
- */
- public OnItemClickListener listener = new OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- // TODO Auto-generated method stub
- System.out.println("position="+position);
- }
- };
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- android.os.Process.killProcess(android.os.Process.myPid());
- super.onDestroy();
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- finish();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
- // 更新后台数据
- class MyThread implements Runnable {
- public void run() {
- try {
- Thread.sleep(1000*3);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- String msglist = "1";
- Message msg = new Message();
- Bundle b = new Bundle();// 存放数据
- b.putString("rmsg", msglist);
- msg.setData(b);
- AllAppList.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
- }
- }
- class MyHandler extends Handler {
- private AllAppList mContext;
- public MyHandler(Context conn,int a) {
- mContext = (AllAppList)conn;
- }
- public MyHandler(Looper L) {
- super(L);
- }
- // 子类必须重写此方法,接受数据
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Bundle b = msg.getData();
- String rmsg = b.getString("rmsg");
- if ("1".equals(rmsg)) {
- // do nothing
- List<Map> list = new ArrayList<Map>();
- for(int i =0;i<16;i++){
- n++;
- Map map = new HashMap();
- map.put("name", n);
- list.add(map);
- }
- int pageNo = (int)Math.ceil( list.size()/APP_PAGE_SIZE);
- for (int i = 0; i < pageNo; i++) {
- GridView appPage = new GridView(mContext);
- // get the "i" page data
- appPage.setAdapter(new AppAdapter(mContext, list, i));
- appPage.setNumColumns(2);
- appPage.setOnItemClickListener(listener);
- mScrollLayout.addView(appPage);
- }
- //加载分页
- pageControl = (PageControlView) findViewById(R.id.pageControl);
- pageControl.bindScrollViewGroup(mScrollLayout);
- //加载分页数据
- dataLoad.bindScrollViewGroup(mScrollLayout);
- }
- }
- }
- //分页数据
- class DataLoading {
- private int count;
- public void bindScrollViewGroup(ScrollLayout scrollViewGroup) {
- this.count=scrollViewGroup.getChildCount();
- scrollViewGroup.setOnScreenChangeListenerDataLoad(new OnScreenChangeListenerDataLoad() {
- public void onScreenChange(int currentIndex) {
- // TODO Auto-generated method stub
- generatePageControl(currentIndex);
- }
- });
- }
- private void generatePageControl(int currentIndex){
- //如果到最后一页,就加载16条记录
- if(count==currentIndex+1){
- MyThread m = new MyThread();
- new Thread(m).start();
- }
- }
- }
- }
- package cn.anycall.ju;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.content.pm.ResolveInfo;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
- import cn.anycall.ju.R;
- public class AppAdapter extends BaseAdapter {
- private List<Map> mList;
- private Context mContext;
- public static final int APP_PAGE_SIZE = 4;
- private PackageManager pm;
- public AppAdapter(Context context, List<Map> list, int page) {
- mContext = context;
- pm = context.getPackageManager();
- mList = new ArrayList<Map>();
- int i = page * APP_PAGE_SIZE;
- int iEnd = i+APP_PAGE_SIZE;
- while ((i<list.size()) && (i<iEnd)) {
- mList.add(list.get(i));
- i++;
- }
- }
- public int getCount() {
- // TODO Auto-generated method stub
- return mList.size();
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return mList.get(position);
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- Map appInfo = mList.get(position);
- AppItem appItem;
- if (convertView == null) {
- View v = LayoutInflater.from(mContext).inflate(R.layout.app_item, null);
- appItem = new AppItem();
- appItem.mAppIcon = (ImageView)v.findViewById(R.id.imgdetail);
- appItem.mAppName = (TextView)v.findViewById(R.id.tuaninfo);
- v.setTag(appItem);
- convertView = v;
- } else {
- appItem = (AppItem)convertView.getTag();
- }
- // set the icon
- appItem.mAppIcon.setImageResource(R.drawable.icon);
- // set the app name
- appItem.mAppName.setText(appInfo.get("name").toString());
- return convertView;
- }
- /**
- * 每个应用显示的内容,包括图标和名称
- * @author Yao.GUET
- *
- */
- class AppItem {
- ImageView mAppIcon;
- TextView mAppName;
- }
- }
- package cn.anycall.ju;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.content.pm.ResolveInfo;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
- import cn.anycall.ju.R;
- public class AppAdapter extends BaseAdapter {
- private List<Map> mList;
- private Context mContext;
- public static final int APP_PAGE_SIZE = 4;
- private PackageManager pm;
- public AppAdapter(Context context, List<Map> list, int page) {
- mContext = context;
- pm = context.getPackageManager();
- mList = new ArrayList<Map>();
- int i = page * APP_PAGE_SIZE;
- int iEnd = i+APP_PAGE_SIZE;
- while ((i<list.size()) && (i<iEnd)) {
- mList.add(list.get(i));
- i++;
- }
- }
- public int getCount() {
- // TODO Auto-generated method stub
- return mList.size();
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return mList.get(position);
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- Map appInfo = mList.get(position);
- AppItem appItem;
- if (convertView == null) {
- View v = LayoutInflater.from(mContext).inflate(R.layout.app_item, null);
- appItem = new AppItem();
- appItem.mAppIcon = (ImageView)v.findViewById(R.id.imgdetail);
- appItem.mAppName = (TextView)v.findViewById(R.id.tuaninfo);
- v.setTag(appItem);
- convertView = v;
- } else {
- appItem = (AppItem)convertView.getTag();
- }
- // set the icon
- appItem.mAppIcon.setImageResource(R.drawable.icon);
- // set the app name
- appItem.mAppName.setText(appInfo.get("name").toString());
- return convertView;
- }
- /**
- * 每个应用显示的内容,包括图标和名称
- * @author Yao.GUET
- *
- */
- class AppItem {
- ImageView mAppIcon;
- TextView mAppName;
- }
- }
- package cn.anycall.ju;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import cn.anycall.ju.R;
- import cn.anycall.ju.ScrollLayout.OnScreenChangeListener;
- public class PageControlView extends LinearLayout {
- private Context context;
- private int count;
- public void bindScrollViewGroup(ScrollLayout scrollViewGroup) {
- this.count=scrollViewGroup.getChildCount();
- System.out.println("count="+count);
- generatePageControl(scrollViewGroup.getCurrentScreenIndex());
- scrollViewGroup.setOnScreenChangeListener(new OnScreenChangeListener() {
- public void onScreenChange(int currentIndex) {
- // TODO Auto-generated method stub
- generatePageControl(currentIndex);
- }
- });
- }
- public PageControlView(Context context) {
- super(context);
- this.init(context);
- }
- public PageControlView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.init(context);
- }
- private void init(Context context) {
- this.context=context;
- }
- private void generatePageControl(int currentIndex) {
- this.removeAllViews();
- int pageNum = 6; // 显示多少个
- int pageNo = currentIndex+1; //第几页
- int pageSum = this.count; //总共多少页
- if(pageSum>1){
- int currentNum = (pageNo % pageNum == 0 ? (pageNo / pageNum) - 1
- : (int) (pageNo / pageNum))
- * pageNum;
- if (currentNum < 0)
- currentNum = 0;
- if (pageNo > pageNum){
- ImageView imageView = new ImageView(context);
- imageView.setImageResource(R.drawable.zuo);
- this.addView(imageView);
- }
- for (int i = 0; i < pageNum; i++) {
- if ((currentNum + i + 1) > pageSum || pageSum < 2)
- break;
- ImageView imageView = new ImageView(context);
- if(currentNum + i + 1 == pageNo){
- imageView.setImageResource(R.drawable.page_indicator_focused);
- }else{
- imageView.setImageResource(R.drawable.page_indicator);
- }
- this.addView(imageView);
- }
- if (pageSum > (currentNum + pageNum)) {
- ImageView imageView = new ImageView(context);
- imageView.setImageResource(R.drawable.you);
- this.addView(imageView);
- }
- }
- }
- }
- package cn.anycall.ju;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import cn.anycall.ju.R;
- import cn.anycall.ju.ScrollLayout.OnScreenChangeListener;
- public class PageControlView extends LinearLayout {
- private Context context;
- private int count;
- public void bindScrollViewGroup(ScrollLayout scrollViewGroup) {
- this.count=scrollViewGroup.getChildCount();
- System.out.println("count="+count);
- generatePageControl(scrollViewGroup.getCurrentScreenIndex());
- scrollViewGroup.setOnScreenChangeListener(new OnScreenChangeListener() {
- public void onScreenChange(int currentIndex) {
- // TODO Auto-generated method stub
- generatePageControl(currentIndex);
- }
- });
- }
- public PageControlView(Context context) {
- super(context);
- this.init(context);
- }
- public PageControlView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.init(context);
- }
- private void init(Context context) {
- this.context=context;
- }
- private void generatePageControl(int currentIndex) {
- this.removeAllViews();
- int pageNum = 6; // 显示多少个
- int pageNo = currentIndex+1; //第几页
- int pageSum = this.count; //总共多少页
- if(pageSum>1){
- int currentNum = (pageNo % pageNum == 0 ? (pageNo / pageNum) - 1
- : (int) (pageNo / pageNum))
- * pageNum;
- if (currentNum < 0)
- currentNum = 0;
- if (pageNo > pageNum){
- ImageView imageView = new ImageView(context);
- imageView.setImageResource(R.drawable.zuo);
- this.addView(imageView);
- }
- for (int i = 0; i < pageNum; i++) {
- if ((currentNum + i + 1) > pageSum || pageSum < 2)
- break;
- ImageView imageView = new ImageView(context);
- if(currentNum + i + 1 == pageNo){
- imageView.setImageResource(R.drawable.page_indicator_focused);
- }else{
- imageView.setImageResource(R.drawable.page_indicator);
- }
- this.addView(imageView);
- }
- if (pageSum > (currentNum + pageNum)) {
- ImageView imageView = new ImageView(context);
- imageView.setImageResource(R.drawable.you);
- this.addView(imageView);
- }
- }
- }
- }
- package cn.anycall.ju;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.VelocityTracker;
- import android.view.View;
- import android.view.ViewConfiguration;
- import android.view.ViewGroup;
- import android.widget.Scroller;
- /**
- * 仿Launcher中的WorkSapce,可以左右滑动切换屏幕的类
- *
- */
- public class ScrollLayout extends ViewGroup {
- private static final String TAG = "ScrollLayout";
- private Scroller mScroller;
- private VelocityTracker mVelocityTracker;
- private int mCurScreen;
- private int mDefaultScreen = 0;
- private static final int TOUCH_STATE_REST = 0;
- private static final int TOUCH_STATE_SCROLLING = 1;
- private static final int SNAP_VELOCITY = 600;
- private int mTouchState = TOUCH_STATE_REST;
- private int mTouchSlop;
- private float mLastMotionX;
- private float mLastMotionY;
- private int currentScreenIndex = 0;
- public int getCurrentScreenIndex() {
- return currentScreenIndex;
- }
- public void setCurrentScreenIndex(int currentScreenIndex) {
- this.currentScreenIndex = currentScreenIndex;
- }
- public ScrollLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- // TODO Auto-generated constructor stub
- }
- public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
- mScroller = new Scroller(context);
- mCurScreen = mDefaultScreen;
- mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
- }
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // TODO Auto-generated method stub
- int childLeft = 0;
- final int childCount = getChildCount();
- System.out.println("childCount=" + childCount);
- for (int i = 0; i < childCount; i++) {
- final View childView = getChildAt(i);
- if (childView.getVisibility() != View.GONE) {
- final int childWidth = childView.getMeasuredWidth();
- childView.layout(childLeft, 0, childLeft + childWidth,
- childView.getMeasuredHeight());
- childLeft += childWidth;
- }
- }
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- Log.e(TAG, "onMeasure");
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- final int width = MeasureSpec.getSize(widthMeasureSpec);
- final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- if (widthMode != MeasureSpec.EXACTLY) {
- throw new IllegalStateException(
- "ScrollLayout only canmCurScreen run at EXACTLY mode!");
- }
- final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- if (heightMode != MeasureSpec.EXACTLY) {
- throw new IllegalStateException(
- "ScrollLayout only can run at EXACTLY mode!");
- }
- // The children are given the same width and height as the scrollLayout
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
- }
- System.out.println("moving to screen " + mCurScreen);
- scrollTo(mCurScreen * width, 0);
- }
- /**
- * According to the position of current layout scroll to the destination
- * page.
- */
- public void snapToDestination() {
- final int screenWidth = getWidth();
- final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
- snapToScreen(destScreen);
- }
- public void snapToScreen(int whichScreen) {
- // get the valid layout page
- whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
- if (getScrollX() != (whichScreen * getWidth())) {
- final int delta = whichScreen * getWidth() - getScrollX();
- mScroller.startScroll(getScrollX(), 0, delta, 0,
- Math.abs(delta) * 2);
- mCurScreen = whichScreen;
- invalidate(); // Redraw the layout
- }
- }
- public void setToScreen(int whichScreen) {
- whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
- mCurScreen = whichScreen;
- scrollTo(whichScreen * getWidth(), 0);
- }
- public int getCurScreen() {
- return mCurScreen;
- }
- @Override
- public void computeScroll() {
- // TODO Auto-generated method stub
- if (mScroller.computeScrollOffset()) {
- scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
- postInvalidate();
- }
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // TODO Auto-generated method stub
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(event);
- final int action = event.getAction();
- final float x = event.getX();
- final float y = event.getY();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG, "event down!");
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- }
- mLastMotionX = x;
- break;
- case MotionEvent.ACTION_MOVE:
- int deltaX = (int) (mLastMotionX - x);
- mLastMotionX = x;
- scrollBy(deltaX, 0);
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG, "event : up");
- // if (mTouchState == TOUCH_STATE_SCROLLING) {
- final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
- int velocityX = (int) velocityTracker.getXVelocity();
- Log.e(TAG, "velocityX:" + velocityX);
- if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
- // Fling enough to move left
- Log.e(TAG, "snap left");
- onScreenChangeListener.onScreenChange(mCurScreen - 1);
- System.out.println("mCurScreen=" + (mCurScreen - 1));
- snapToScreen(mCurScreen - 1);
- } else if (velocityX < -SNAP_VELOCITY
- && mCurScreen < getChildCount() - 1) {
- // Fling enough to move right
- Log.e(TAG, "snap right");
- onScreenChangeListener.onScreenChange(mCurScreen + 1);
- //只往右移动才加载数据
- onScreenChangeListenerDataLoad.onScreenChange(mCurScreen+1);
- snapToScreen(mCurScreen + 1);
- } else {
- snapToDestination();
- }
- if (mVelocityTracker != null) {
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- }
- // }
- mTouchState = TOUCH_STATE_REST;
- break;
- case MotionEvent.ACTION_CANCEL:
- mTouchState = TOUCH_STATE_REST;
- break;
- }
- return true;
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- // TODO Auto-generated method stub
- Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop);
- final int action = ev.getAction();
- if ((action == MotionEvent.ACTION_MOVE)
- && (mTouchState != TOUCH_STATE_REST)) {
- return true;
- }
- final float x = ev.getX();
- final float y = ev.getY();
- switch (action) {
- case MotionEvent.ACTION_MOVE:
- final int xDiff = (int) Math.abs(mLastMotionX - x);
- if (xDiff > mTouchSlop) {
- mTouchState = TOUCH_STATE_SCROLLING;
- }
- break;
- case MotionEvent.ACTION_DOWN:
- mLastMotionX = x;
- mLastMotionY = y;
- mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
- : TOUCH_STATE_SCROLLING;
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- mTouchState = TOUCH_STATE_REST;
- break;
- }
- return mTouchState != TOUCH_STATE_REST;
- }
- //分页监听
- public interface OnScreenChangeListener {
- void onScreenChange(int currentIndex);
- }
- private OnScreenChangeListener onScreenChangeListener;
- public void setOnScreenChangeListener(
- OnScreenChangeListener onScreenChangeListener) {
- this.onScreenChangeListener = onScreenChangeListener;
- }
- //动态数据监听
- public interface OnScreenChangeListenerDataLoad {
- void onScreenChange(int currentIndex);
- }
- private OnScreenChangeListenerDataLoad onScreenChangeListenerDataLoad;
- public void setOnScreenChangeListenerDataLoad(OnScreenChangeListenerDataLoad onScreenChangeListenerDataLoad) {
- this.onScreenChangeListenerDataLoad = onScreenChangeListenerDataLoad;
- }
- }
- package cn.anycall.ju;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.VelocityTracker;
- import android.view.View;
- import android.view.ViewConfiguration;
- import android.view.ViewGroup;
- import android.widget.Scroller;
- /**
- * 仿Launcher中的WorkSapce,可以左右滑动切换屏幕的类
- *
- */
- public class ScrollLayout extends ViewGroup {
- private static final String TAG = "ScrollLayout";
- private Scroller mScroller;
- private VelocityTracker mVelocityTracker;
- private int mCurScreen;
- private int mDefaultScreen = 0;
- private static final int TOUCH_STATE_REST = 0;
- private static final int TOUCH_STATE_SCROLLING = 1;
- private static final int SNAP_VELOCITY = 600;
- private int mTouchState = TOUCH_STATE_REST;
- private int mTouchSlop;
- private float mLastMotionX;
- private float mLastMotionY;
- private int currentScreenIndex = 0;
- public int getCurrentScreenIndex() {
- return currentScreenIndex;
- }
- public void setCurrentScreenIndex(int currentScreenIndex) {
- this.currentScreenIndex = currentScreenIndex;
- }
- public ScrollLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- // TODO Auto-generated constructor stub
- }
- public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
- mScroller = new Scroller(context);
- mCurScreen = mDefaultScreen;
- mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
- }
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // TODO Auto-generated method stub
- int childLeft = 0;
- final int childCount = getChildCount();
- System.out.println("childCount=" + childCount);
- for (int i = 0; i < childCount; i++) {
- final View childView = getChildAt(i);
- if (childView.getVisibility() != View.GONE) {
- final int childWidth = childView.getMeasuredWidth();
- childView.layout(childLeft, 0, childLeft + childWidth,
- childView.getMeasuredHeight());
- childLeft += childWidth;
- }
- }
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- Log.e(TAG, "onMeasure");
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- final int width = MeasureSpec.getSize(widthMeasureSpec);
- final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- if (widthMode != MeasureSpec.EXACTLY) {
- throw new IllegalStateException(
- "ScrollLayout only canmCurScreen run at EXACTLY mode!");
- }
- final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- if (heightMode != MeasureSpec.EXACTLY) {
- throw new IllegalStateException(
- "ScrollLayout only can run at EXACTLY mode!");
- }
- // The children are given the same width and height as the scrollLayout
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
- }
- System.out.println("moving to screen " + mCurScreen);
- scrollTo(mCurScreen * width, 0);
- }
- /**
- * According to the position of current layout scroll to the destination
- * page.
- */
- public void snapToDestination() {
- final int screenWidth = getWidth();
- final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
- snapToScreen(destScreen);
- }
- public void snapToScreen(int whichScreen) {
- // get the valid layout page
- whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
- if (getScrollX() != (whichScreen * getWidth())) {
- final int delta = whichScreen * getWidth() - getScrollX();
- mScroller.startScroll(getScrollX(), 0, delta, 0,
- Math.abs(delta) * 2);
- mCurScreen = whichScreen;
- invalidate(); // Redraw the layout
- }
- }
- public void setToScreen(int whichScreen) {
- whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
- mCurScreen = whichScreen;
- scrollTo(whichScreen * getWidth(), 0);
- }
- public int getCurScreen() {
- return mCurScreen;
- }
- @Override
- public void computeScroll() {
- // TODO Auto-generated method stub
- if (mScroller.computeScrollOffset()) {
- scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
- postInvalidate();
- }
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // TODO Auto-generated method stub
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(event);
- final int action = event.getAction();
- final float x = event.getX();
- final float y = event.getY();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- Log.e(TAG, "event down!");
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- }
- mLastMotionX = x;
- break;
- case MotionEvent.ACTION_MOVE:
- int deltaX = (int) (mLastMotionX - x);
- mLastMotionX = x;
- scrollBy(deltaX, 0);
- break;
- case MotionEvent.ACTION_UP:
- Log.e(TAG, "event : up");
- // if (mTouchState == TOUCH_STATE_SCROLLING) {
- final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000);
- int velocityX = (int) velocityTracker.getXVelocity();
- Log.e(TAG, "velocityX:" + velocityX);
- if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
- // Fling enough to move left
- Log.e(TAG, "snap left");
- onScreenChangeListener.onScreenChange(mCurScreen - 1);
- System.out.println("mCurScreen=" + (mCurScreen - 1));
- snapToScreen(mCurScreen - 1);
- } else if (velocityX < -SNAP_VELOCITY
- && mCurScreen < getChildCount() - 1) {
- // Fling enough to move right
- Log.e(TAG, "snap right");
- onScreenChangeListener.onScreenChange(mCurScreen + 1);
- //只往右移动才加载数据
- onScreenChangeListenerDataLoad.onScreenChange(mCurScreen+1);
- snapToScreen(mCurScreen + 1);
- } else {
- snapToDestination();
- }
- if (mVelocityTracker != null) {
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- }
- // }
- mTouchState = TOUCH_STATE_REST;
- break;
- case MotionEvent.ACTION_CANCEL:
- mTouchState = TOUCH_STATE_REST;
- break;
- }
- return true;
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- // TODO Auto-generated method stub
- Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop);
- final int action = ev.getAction();
- if ((action == MotionEvent.ACTION_MOVE)
- && (mTouchState != TOUCH_STATE_REST)) {
- return true;
- }
- final float x = ev.getX();
- final float y = ev.getY();
- switch (action) {
- case MotionEvent.ACTION_MOVE:
- final int xDiff = (int) Math.abs(mLastMotionX - x);
- if (xDiff > mTouchSlop) {
- mTouchState = TOUCH_STATE_SCROLLING;
- }
- break;
- case MotionEvent.ACTION_DOWN:
- mLastMotionX = x;
- mLastMotionY = y;
- mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
- : TOUCH_STATE_SCROLLING;
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- mTouchState = TOUCH_STATE_REST;
- break;
- }
- return mTouchState != TOUCH_STATE_REST;
- }
- //分页监听
- public interface OnScreenChangeListener {
- void onScreenChange(int currentIndex);
- }
- private OnScreenChangeListener onScreenChangeListener;
- public void setOnScreenChangeListener(
- OnScreenChangeListener onScreenChangeListener) {
- this.onScreenChangeListener = onScreenChangeListener;
- }
- //动态数据监听
- public interface OnScreenChangeListenerDataLoad {
- void onScreenChange(int currentIndex);
- }
- private OnScreenChangeListenerDataLoad onScreenChangeListenerDataLoad;
- public void setOnScreenChangeListenerDataLoad(OnScreenChangeListenerDataLoad onScreenChangeListenerDataLoad) {
- this.onScreenChangeListenerDataLoad = onScreenChangeListenerDataLoad;
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="仿淘宝聚划算"/>
- <RelativeLayout
- android:id="@+id/myView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <cn.anycall.ju.ScrollLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ScrollLayoutTest"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:background="#000000" >
- </cn.anycall.ju.ScrollLayout>
- <cn.anycall.ju.PageControlView
- android:id="@+id/pageControl"
- android:layout_width="fill_parent"
- android:layout_height="40px"
- android:background="#8f00000f"
- android:layout_alignParentBottom="true"
- android:gravity="center"/>
- </RelativeLayout>
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="仿淘宝聚划算"/>
- <RelativeLayout
- android:id="@+id/myView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <cn.anycall.ju.ScrollLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ScrollLayoutTest"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:background="#000000" >
- </cn.anycall.ju.ScrollLayout>
- <cn.anycall.ju.PageControlView
- android:id="@+id/pageControl"
- android:layout_width="fill_parent"
- android:layout_height="40px"
- android:background="#8f00000f"
- android:layout_alignParentBottom="true"
- android:gravity="center"/>
- </RelativeLayout>
- </LinearLayout>
app_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <RelativeLayout android:id="@+id/alllayout" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <RelativeLayout android:id="@+id/imglayout" android:layout_width="160dp" android:layout_height="160dp" android:background="@drawable/mer_border">
- <ImageView android:id="@+id/imgdetail" android:layout_width="145dp" android:layout_height="145dp" android:layout_margin="8dp" />
- <TextView android:id="@+id/price" android:layout_width="180dp" android:layout_height="wrap_content" android:text="12345" android:layout_alignParentBottom="true" android:background="#C02000" android:textColor="#FFFFFF"/>
- <TextView android:id="@+id/look" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去看看" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="#C02000" android:textColor="#FFFFFF"/>
- </RelativeLayout>
- <TextView android:id="@+id/tuaninfo" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:textSize="16dp"
- android:maxLines="2" android:layout_below="@id/imglayout"
- android:ellipsize="end" android:text="dddddddddd"/>"
- </RelativeLayout>
- </RelativeLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <RelativeLayout android:id="@+id/alllayout" android:layout_width="wrap_content" android:layout_height="wrap_content">
- <RelativeLayout android:id="@+id/imglayout" android:layout_width="160dp" android:layout_height="160dp" android:background="@drawable/mer_border">
- <ImageView android:id="@+id/imgdetail" android:layout_width="145dp" android:layout_height="145dp" android:layout_margin="8dp" />
- <TextView android:id="@+id/price" android:layout_width="180dp" android:layout_height="wrap_content" android:text="12345" android:layout_alignParentBottom="true" android:background="#C02000" android:textColor="#FFFFFF"/>
- <TextView android:id="@+id/look" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去看看" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="#C02000" android:textColor="#FFFFFF"/>
- </RelativeLayout>
- <TextView android:id="@+id/tuaninfo" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:textSize="16dp"
- android:maxLines="2" android:layout_below="@id/imglayout"
- android:ellipsize="end" android:text="dddddddddd"/>"
- </RelativeLayout>
- </RelativeLayout>
android左右滑动加载分页以及动态加载数据的更多相关文章
- android中滑动SQLite数据库分页加载
今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...
- Delphi静态加载DLL和动态加载DLL示例
下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...
- vc静态加载dll和动态加载dll
如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib, &quo ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- c# 创建Excel com加载项Ribbon动态加载工作簿和工作表
使用 VSTO 创建外接程序,Gallery控件动态加载工作簿名称 代码如下: 加载工作簿名称: private void Gallery1_ItemsLoading(object sender, R ...
- Android 图片从网页中获取并动态加载到listview中
实现功能: 效果图: 代码:这里
- 通过Activity动态加载Fragment创建主界面构架
在做项目中,需要建立一个主界面框架,尝试过使用ViewPager ,后来又换成了使用Activity动态加载Fragment实现选项卡的效果.总结一下方便以后回顾. 先给出总体效果: 要实现上述效果, ...
- Android动态加载入坑指南
曾几何时,国内各大公司掀起了一股研究Android动态加载的技术,两年多过去了,动态加载技术俨然成了Android开发中必须掌握的技术.那么动态加载技术是什么呢,这里谈谈我的个人看法,如有雷同,纯属偶 ...
- 插件化开发—动态加载技术加载已安装和未安装的apk
首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...
随机推荐
- 无废话版本-Asp.net MVC4.0 Rasor的基本用法
最近工作有点忙,好久没写东西了!废话不多说了,进入主题! 1.在页面中输出单一变量时候,只要在C#语句之前加上@符号即可,For example: <p>Now Time:@DateTim ...
- C#扩展方法入门
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 仅当你使用 using 指令将命名空间显式导入到源代码 ...
- hdu 4282 A very hard mathematic problem
由于k的范围是0-2^31,而且x,y,z都是正整数,由题易知道2<=z<31,1<=x<y;所以直接枚举就好了!!! #include<iostream> #in ...
- TopCoder 603 div1 & div2
div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...
- jndi配置数据源
jndi(java Naming and DirectoryInterface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API. 命名服务将名称和对象联系起来,使得我们可以用 ...
- *[topcoder]ChooseTheBestOne
https://www.topcoder.com/stat?c=problem_statement&pm=13146&rd=15852 // Need carefully calc t ...
- ubuntu下安装pthread的manpages(man 手册) 在Ubuntu中查看STL帮助
http://blog.csdn.net/leisure512/article/details/4881391 由于学习多线程编程,所以用到pthread,但是man的时候却发现没有pthread函数 ...
- mysql级联更新的两种方式:触发器更新和外键
1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...
- HTML5入门2---js获取HTML元素的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Orcle数据库查询练习复习:二
一.题目 1.找出所有成绩均低于80的学生姓名 select sname from student where sid in( ) select sname from student where si ...