首页 > 代码库 > android左右滑动加载分页以及动态加载数据

android左右滑动加载分页以及动态加载数据

android UI 往右滑动,滑动到最后一页就自动加载数据并显示
如图:



Java代码 
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();            }        }    }}
Java代码
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;    }}
Java代码
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);             }        }    }}

Java代码

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;    }}

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> 

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>