• 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>
  • 相关阅读:
    IOS-常用第三方开源框架介绍
    IOS-底层数据结构
    iOS UI-QQ聊天布局
    iOS UI-微博案例(通过代码自定义Cell)
    iOS UI-界面传值(三种方法)
    OC Block(代码块)
    一条进程的栈区、堆区、数据区和代码区在内存中的映射
    iOS UI-团购案例(通过xib文件自定义UITableViewCell)
    iOS UI-UIPickerView(拾取器)、UIWebView(网页视图)和传值方式
    Android 编程下模拟 HOME 键效果
  • 原文地址:https://www.cnblogs.com/a354823200/p/3918899.html
Copyright © 2020-2023  润新知