SeekBar相信用的人不是很多,一般都是用水平SeekBar就可以了。但是之前项目中考虑使用垂直的SeekBar,就要继承重写SeekBar才能用。而垂直SeekBar在百度搜了一下,关于这方面文章还是很少,有一些还是不全面。我又去了github找了一下,找到了一个垂直的效果以及源码,我就写了一个滚动SeekBar翻页listview的数据效果。所以这篇博客中源码下载中,有三个项目源码,干货多多。

下载地址:http://download.csdn.net/detail/qq_16064871/9445535

1、先看一下水平SeekBar

这种是用系统SeekBar,是水平的。我在滚动SeekBar上面加了页码提示。滚动页码时候也可以翻页listview的数据。先看效果。


看着上面效果还是很不错吧,觉得很赞。接下来看看原理。

其实这个原理很简单,这个滚动SeekBar以及listview管理都是一系列的序号,就是多少项数据的索引吧。用一个list记住每一页的表头第一项的索引值,因为每一页数据都是固定。就比如每一页数据是30,那么第一页第一项索引就是0,第二页是30,第三页是60.。。。以此类推,还有根据你滑动进度条,获得那一页数据,再根据这一页表头索引加上30就是这一页的数据。所以管理都是序号或者说索引。所以所以最后获取数据是这样的mArrayList.get(mPageItemsIndex.get(position).intValue())。而这个就是每一页数据索引值mPageItemsIndex.get(position).intValue()。好了说了那么多,看代码吧。

先看这个public class LevelPageSeekBar extends SeekBar

package com.org.view;import com.org.pageseekbar.R;import android.content.Context;import android.util.AttributeSet;import android.widget.SeekBar;import android.widget.TextView;//自定义页码进度条public class LevelPageSeekBar extends SeekBar {private QuickAction mSeekBarTipsQuickAction;private int mPageCount = 0;private boolean mIsTouch = false;private TextView mTipsTitle;private OnSeekBarPageChangeListener mBarPageChangeListener;public LevelPageSeekBar(Context context, AttributeSet attrs) {super(context, attrs);mSeekBarTipsQuickAction = new QuickAction(context, QuickAction.HORIZONTAL);ActionItem tipsItem      = new ActionItem(0, context.getResources().getString(R.string.Move), null);tipsItem.setIcon(null);mSeekBarTipsQuickAction.addActionItem(tipsItem);mTipsTitle = (TextView)mSeekBarTipsQuickAction.GetActionItemsGroup().getChildAt(0).findViewById(R.id.tv_title);//设置系统进度条的监听setOnSeekBarChangeListener(mSeekBarChangeListener);//最大页码是10000setMax(10000);}//进度条改变的接口public interface OnSeekBarPageChangeListener {public abstract void setSeekBarScrolling(TextView tips, int page);public abstract void setSeekBarPageChanged(int page);}//注册接口public void setSeekBarPageChangeListener(OnSeekBarPageChangeListener listener) {mBarPageChangeListener = listener;}//设置进度条页数public void setPagesCount(int count) {mPageCount = count;}//设置不显示弹出第几页提示public void setHideSeekPopWindow() {mSeekBarTipsQuickAction.dismiss();}private int getProgressIsPageIndex(int progress, int max) {if (mPageCount < 2) {if (progress == 0) return 0;else return 1;}if (progress == 0) return 0;// 获取每一块的进度值int progressSizeEveryPage = getMax()/(mPageCount-1);for (int i = 1; i < mPageCount; i++) {if (progress <= (i)*progressSizeEveryPage && progress > ((i-1)*progressSizeEveryPage)) {if (progress > (2*i-1)*progressSizeEveryPage/2 ) return i;else return i-1;}}return mPageCount-1;}//外面调用上下按键翻页,需要同时滚动进度条效果public void setProgressSpecialPage(int pageIndex, int count) {if (count <= 1) {setProgress(0);return;}mPageCount = count;if (pageIndex < 0 || pageIndex >= mPageCount) return;int progressSizeEveryPage = getMax()/(mPageCount-1);setProgress( progressSizeEveryPage*pageIndex);}//弹出当前显示第几页的提示private void showSeekPopWindow() {if (mSeekBarTipsQuickAction == null) return;// 获取每一刻度的宽度float thumb_x = ((float)this.getWidth() - 44)/(float)this.getMax();// 获取控件的屏幕位置int[] location = new int[2];this.getLocationOnScreen(location);int x = (int) ((float)thumb_x*(float)getProgress()) + 22;if (mBarPageChangeListener != null) mBarPageChangeListener.setSeekBarScrolling(mTipsTitle, getProgressIsPageIndex(getProgress(), getMax()));mSeekBarTipsQuickAction.show(this, (int)(x + location[0]), location[1]);}//系统进度条的监听方法private OnSeekBarChangeListener mSeekBarChangeListener = new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar arg0) {mIsTouch = false;setHideSeekPopWindow();}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {mIsTouch = true;}@Overridepublic void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {if (mIsTouch) showSeekPopWindow();if (mBarPageChangeListener != null) mBarPageChangeListener.setSeekBarPageChanged( getProgressIsPageIndex(getProgress(), getMax()));}};}

再看怎么调用或者说使用。看MainActivity

package com.org.pageseekbar;import java.util.ArrayList;import com.org.view.LevelPageSeekBar;import com.org.view.LevelPageSeekBar.OnSeekBarPageChangeListener;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity implements OnSeekBarPageChangeListener,OnClickListener{//页码进度条private LevelPageSeekBar mPageSeekBar;//数据源private ArrayList mArrayList;// 一页最多多少条数据protected int mMaxShowLinesPage = 20;// 当前是第几页protected int mCurrentSelectPageIndex = 0;// 当前有多少页protected int mPagesCount = 0;// 当前的有效记录数protected int mRecordCount = 0;// 存放每页数据第一条数据的索引protected ArrayList mEveryPageOffestArray = new ArrayList();// 当前页面的每一项的偏移数据 方便检索数据和删除数据protected ArrayList mPageItemsIndex = new ArrayList();//listview的适配器protected ListViewAdapter mAdapter;//测试数据的条数private int mnTestCount = 530;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initDatas();initView();}private void initDatas() {if (mArrayList == null) {mArrayList = new ArrayList();for (int i = 0; i < mnTestCount; i++) {mArrayList.add("第   " + String.valueOf(i) + " 项");}}}private void initView() {mPageSeekBar = (LevelPageSeekBar)findViewById(R.id.seekBar);mPageSeekBar.setSeekBarPageChangeListener(this);Button imageviewUp = (Button)findViewById(R.id.imageviewUp);imageviewUp.setOnClickListener(this);Button imageviewDown = (Button)findViewById(R.id.imageviewDown);imageviewDown.setOnClickListener(this);    ListView listView = (ListView)findViewById(R.id.listView1);    mAdapter = new ListViewAdapter(this);    listView.setAdapter(mAdapter);        initResetListView(0);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.imageviewUp:setPrePage();break;case R.id.imageviewDown:setAftPage();break;default:break;}}//初始化进度条管理数据显示protected void initResetListView(int pageIndex) {mRecordCount = mArrayList.size();// 计算有多少页数据    mPagesCount = mRecordCount/mMaxShowLinesPage + (mRecordCount%mMaxShowLinesPage == 0 ? 0 : 1);        // 判断 页面数目是2的时候, 简化为1页    if (mPagesCount == 2) {    mMaxShowLinesPage = mMaxShowLinesPage * 2;    mPagesCount = 1;    } else {    mMaxShowLinesPage = 20;    }// 设置当前选中也为0mCurrentSelectPageIndex = pageIndex;if (mCurrentSelectPageIndex >= mPagesCount)mCurrentSelectPageIndex = mPagesCount - 1;//刷新每一页的首偏移setResetEveryPageOffestArray();//根据首偏移,得到这一页偏移序号    setResetPageItemsIndex(mCurrentSelectPageIndex);//上下按键翻页,需要同时滚动进度条效果.如果只有两页数据,不显示进度条    setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,false);    //总共几页,设置到进度条控件    mPageSeekBar.setPagesCount(mPagesCount);}//刷新每一页的首偏移protected void setResetEveryPageOffestArray() {int nValidItemNums = 0;mEveryPageOffestArray.clear();//记住每页的首偏移序号for (int i = 0; i < mPagesCount; i++) {int nRecordIndex = GetCountSpecialPage(i);mEveryPageOffestArray.add(nValidItemNums);nValidItemNums = nValidItemNums + nRecordIndex;}if (nValidItemNums != mRecordCount) {mRecordCount = nValidItemNums;// 计算有多少页数据    mPagesCount = mRecordCount/mMaxShowLinesPage + (mRecordCount%mMaxShowLinesPage == 0 ? 0 : 1);}}//根据首偏移,得到这一页偏移序号protected void setResetPageItemsIndex(int pageIndex) {if (pageIndex >= mEveryPageOffestArray.size()) return;int pageItemsCount = GetCountSpecialPage(pageIndex);int nRecordIndex = mEveryPageOffestArray.get(pageIndex).intValue();mPageItemsIndex.clear();//首偏移开始累加for(int i = nRecordIndex; i < pageItemsCount + nRecordIndex; i++) {mPageItemsIndex.add(i);}//刷新listview的适配器if (mAdapter != null) {mAdapter.notifyDataSetChanged();}}// 获取当前页面多少数据protected int GetCountSpecialPage(int nPage) {if (nPage < 0) return 0;if(nPage < (mPagesCount-1)) return mMaxShowLinesPage;//如果是最后一页,就是总的数据减去前面几页*每一页的数据//因为页码是从0开始,所以这里是最后一页if (nPage == mPagesCount - 1) return mRecordCount - mMaxShowLinesPage*(mPagesCount-1);return 0;}//上一页protected void setPrePage() {if (mCurrentSelectPageIndex == 0) return;mCurrentSelectPageIndex -= 1;//根据首偏移,得到这一页偏移序号setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,true);}//下一页protected void setAftPage() {if (mCurrentSelectPageIndex == (mPagesCount-1)) return;mCurrentSelectPageIndex += 1;//根据首偏移,得到这一页偏移序号setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,true);}//进度条滑动改变的数据,进行刷新protected void setPageChanged(int index, boolean isSetProgress) {if (index < 0 || index >= mPagesCount || mCurrentSelectPageIndex == index) return;mCurrentSelectPageIndex = index;// 刷新每一项的索引数据setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount, isSetProgress);}//上下按键翻页,需要同时滚动进度条效果.如果只有两页数据,不显示进度条protected void setSelectPageControl(int index, int count, boolean isSet) {View selectPageBar = findViewById(R.id.layoutShow);if (selectPageBar != null) {//如果只有两页数据,不显示进度条if (count <= 1) selectPageBar.setVisibility(View.GONE);else selectPageBar.setVisibility(View.VISIBLE);//上下按键翻页,需要同时滚动进度条效果if (mPageSeekBar != null && isSet == true)mPageSeekBar.setProgressSpecialPage(mCurrentSelectPageIndex, mPagesCount);}}//弹出滑动第几页显示@Overridepublic void setSeekBarScrolling(TextView tips, int page) {if (tips == null) return;String tip_0 = String.format(getString(R.string.CurrentPageTipsFormate), page+1);String tip_1 = String.format(getString(R.string.CurrentPageTipsFormate2), mPagesCount);tips.setText(tip_0 + "/" + tip_1);}//进度条滑动改变的数据,进行刷新@Overridepublic void setSeekBarPageChanged(int page) {setPageChanged(page, false);}private class ViewHolder{TextView textView;}private class ListViewAdapter extends BaseAdapter{private Context mContext;private LayoutInflater mLayoutInflater;public ListViewAdapter(Context context) {mContext = context;mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return mPageItemsIndex.size();}@Overridepublic Object getItem(int position) {return 0;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vHolder = null;if (convertView == null) {vHolder = new ViewHolder();convertView = mLayoutInflater.inflate(R.layout.listview_item, null);vHolder.textView = (TextView)convertView.findViewById(R.id.textView1);convertView.setTag(vHolder);}else {vHolder = (ViewHolder) convertView.getTag();}vHolder.textView.setText(mArrayList.get(mPageItemsIndex.get(position).intValue()));return convertView;}}}
至于弹出显示页码的效果,这个代码有点多,就不一一展示了。有兴趣下载本博客源码。

弹出显示页码的效果有兴趣可以看看这个,也是差不多的:Android 单击listview弹出popupwindow弹出框

2、现在看看我在github上找的垂直SeekBar效果



这里面原理是这样的。你的进度条旋转了,你的画布也要旋转。还有你的Thumb这要重新调转位置,跟着一起滑动。有两种情况,从上图都可以看出了。一种是从上而下,还有一种就是从下而上。

从上而下那个调整画布是这样的,还有一些计算。。。看源码也是继承SeekBar

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(h, w, oldh, oldw);    }    @Override    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(heightMeasureSpec, widthMeasureSpec);        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());    }    //初始值从上往下    protected void onDraw(Canvas c) {        c.rotate(90);        c.translate(0, -getWidth());        super.onDraw(c);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (!isEnabled()) {            return false;        }        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_MOVE:            case MotionEvent.ACTION_UP:            int i=0;            i=getMax() - (int) (getMax() * event.getY() / getHeight());                setProgress(100-i);                Log.i("Progress",getProgress()+"");                onSizeChanged(getWidth(), getHeight(), 0, 0);                break;            case MotionEvent.ACTION_CANCEL:                break;        }        return true;    }
那么从下往上滑动,肯定要反过来旋转了

   protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(h, w, oldh, oldw);    }    @Override    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(heightMeasureSpec, widthMeasureSpec);        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());    }        //初始值从下往上    protected void onDraw(Canvas c) {        c.rotate(-90);        c.translate(-getHeight(),0);        super.onDraw(c);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (!isEnabled()) {            return false;        }        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_MOVE:            case MotionEvent.ACTION_UP:            int i=0;            i=getMax() - (int) (getMax() * event.getY() / getHeight());                setProgress(i);                Log.i("Progress",getProgress()+"");                onSizeChanged(getWidth(), getHeight(), 0, 0);                break;            case MotionEvent.ACTION_CANCEL:                break;        }        return true;    }
其实就是这么简单的。

3、看看我写的垂直SeekBar效果

还是一样,先看效果。




也是对这个listview的数据管理的。就是没有弹出页码的提示,因为弹出感觉不好看,就删了。

看源码:VerticalPageSeekBar extends SeekBar

package com.vertical.view;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.SeekBar;//自定义页码进度条public class VerticalPageSeekBar extends SeekBar {private int mPageCount = 0;private OnSeekBarPageChangeListener mBarPageChangeListener;    public VerticalPageSeekBar(Context context) {        super(context);    }    public VerticalPageSeekBar(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    public VerticalPageSeekBar(Context context, AttributeSet attrs) {super(context, attrs);//设置系统进度条的监听super.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar arg0) {}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {if (mBarPageChangeListener != null) //接口回调mBarPageChangeListener.setSeekBarPageChanged( getProgressIsPageIndex(progress, getMax()));}});setMax(1000);}//进度条改变的接口public interface OnSeekBarPageChangeListener {public abstract void setSeekBarPageChanged(int page);}//注册接口public void setSeekBarPageChangeListener(OnSeekBarPageChangeListener listener) {mBarPageChangeListener = listener;}//Thumb的变化情况    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(h, w, oldh, oldw);    }    //测量宽度也需要旋转    @Override    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(heightMeasureSpec, widthMeasureSpec);        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());    }    //画布旋转90    protected void onDraw(Canvas c) {        c.rotate(-90);        c.translate(-getHeight(),0);        super.onDraw(c);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (!isEnabled()) {            return false;        }        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_MOVE:            case MotionEvent.ACTION_UP:            int i=0;            //设置y值为进度条的值            i=getMax() - (int) (getMax() * event.getY() / getHeight());                setProgress(i);                onSizeChanged(getWidth(), getHeight(), 0, 0);                break;            case MotionEvent.ACTION_CANCEL:                break;        }        return true;    }//设置进度条页数public void setPagesCount(int count) {mPageCount = count;}//分页的进度条的段值private int getProgressIsPageIndex(int progress, int max) {if (mPageCount < 2) {if (progress == 0) return 0;else return 1;}if (progress == 0) return 0;// 获取每一块的进度值int progressSizeEveryPage = getMax()/(mPageCount-1);for (int i = 1; i < mPageCount; i++) {if (progress <= (i)*progressSizeEveryPage && progress > ((i-1)*progressSizeEveryPage)) {if (progress > (2*i-1)*progressSizeEveryPage/2 ) return i;else return i-1;}}return mPageCount-1;}//外面调用上下按键翻页,需要同时滚动进度条效果public void setProgressSpecialPage(int pageIndex, int count) {if (count <= 1) {setProgress(0);return;}mPageCount = count;if (pageIndex < 0 || pageIndex >= mPageCount) return;int progressSizeEveryPage = getMax()/(mPageCount-1);setProgress( progressSizeEveryPage*pageIndex);//设置进度条按钮跟着移动        onSizeChanged(getWidth(), getHeight(), 0, 0);}}

还有怎么使用MainActivity

package com.vertical.pageseekbar;import java.util.ArrayList;import com.vertical.pageseekbar.R;import com.vertical.view.VerticalPageSeekBar;import com.vertical.view.VerticalPageSeekBar.OnSeekBarPageChangeListener;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity implements OnSeekBarPageChangeListener,OnClickListener{//页码进度条private VerticalPageSeekBar mPageSeekBar;//数据源private ArrayList mArrayList;// 一页最多多少条数据protected int mMaxShowLinesPage = 20;// 当前是第几页protected int mCurrentSelectPageIndex = 0;// 当前有多少页protected int mPagesCount = 0;// 当前的有效记录数protected int mRecordCount = 0;// 存放每页数据第一条数据的索引protected ArrayList mEveryPageOffestArray = new ArrayList();// 当前页面的每一项的偏移数据 方便检索数据和删除数据protected ArrayList mPageItemsIndex = new ArrayList();//listview的适配器protected ListViewAdapter mAdapter;//测试数据的条数private int mnTestCount = 230;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initDatas();initView();}private void initDatas() {if (mArrayList == null) {mArrayList = new ArrayList();for (int i = 0; i < mnTestCount; i++) {mArrayList.add("第   " + String.valueOf(i) + " 项");}}}private void initView() {mPageSeekBar = (VerticalPageSeekBar)findViewById(R.id.seekBar);mPageSeekBar.setSeekBarPageChangeListener(this);Button imageviewUp = (Button)findViewById(R.id.imageviewUp);imageviewUp.setOnClickListener(this);Button imageviewDown = (Button)findViewById(R.id.imageviewDown);imageviewDown.setOnClickListener(this);    ListView listView = (ListView)findViewById(R.id.listView1);    mAdapter = new ListViewAdapter(this);    listView.setAdapter(mAdapter);        initResetListView(0);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.imageviewUp:setPrePage();break;case R.id.imageviewDown:setAftPage();break;default:break;}}//初始化进度条管理数据显示protected void initResetListView(int pageIndex) {mRecordCount = mArrayList.size();// 计算有多少页数据    mPagesCount = mRecordCount/mMaxShowLinesPage + (mRecordCount%mMaxShowLinesPage == 0 ? 0 : 1);        // 判断 页面数目是2的时候, 简化为1页    if (mPagesCount == 2) {    mMaxShowLinesPage = mMaxShowLinesPage * 2;    mPagesCount = 1;    } else {    mMaxShowLinesPage = 20;    }// 设置当前选中也为0mCurrentSelectPageIndex = pageIndex;if (mCurrentSelectPageIndex >= mPagesCount)mCurrentSelectPageIndex = mPagesCount - 1;//刷新每一页的首偏移setResetEveryPageOffestArray();//根据首偏移,得到这一页偏移序号    setResetPageItemsIndex(mCurrentSelectPageIndex);//上下按键翻页,需要同时滚动进度条效果.如果只有两页数据,不显示进度条    setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,false);//总共几页,设置到进度条控件    mPageSeekBar.setPagesCount(mPagesCount);}//刷新每一页的首偏移protected void setResetEveryPageOffestArray() {int nValidItemNums = 0;mEveryPageOffestArray.clear();//记住每页的首偏移序号for (int i = 0; i < mPagesCount; i++) {int nRecordIndex = GetCountSpecialPage(i);mEveryPageOffestArray.add(nValidItemNums);nValidItemNums = nValidItemNums + nRecordIndex;}if (nValidItemNums != mRecordCount) {mRecordCount = nValidItemNums;// 计算有多少页数据    mPagesCount = mRecordCount/mMaxShowLinesPage + (mRecordCount%mMaxShowLinesPage == 0 ? 0 : 1);}}//根据首偏移,得到这一页偏移序号protected void setResetPageItemsIndex(int pageIndex) {if (pageIndex >= mEveryPageOffestArray.size()) return;int pageItemsCount = GetCountSpecialPage(pageIndex);int nRecordIndex = mEveryPageOffestArray.get(pageIndex).intValue();mPageItemsIndex.clear();//首偏移开始累加for(int i = nRecordIndex; i < pageItemsCount + nRecordIndex; i++) {mPageItemsIndex.add(i);}//刷新listview的适配器if (mAdapter != null) {mAdapter.notifyDataSetChanged();}}// 获取当前页面多少数据protected int GetCountSpecialPage(int nPage) {if (nPage < 0) return 0;if(nPage < (mPagesCount-1)) return mMaxShowLinesPage;//如果是最后一页,就是总的数据减去前面几页*每一页的数据//因为页码是从0开始,所以这里是最后一页if (nPage == mPagesCount - 1) return mRecordCount - mMaxShowLinesPage*(mPagesCount-1);return 0;}//上一页protected void setPrePage() {if (mCurrentSelectPageIndex == 0) return;mCurrentSelectPageIndex -= 1;//根据首偏移,得到这一页偏移序号setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,true);}//下一页protected void setAftPage() {if (mCurrentSelectPageIndex == (mPagesCount-1)) return;mCurrentSelectPageIndex += 1;//根据首偏移,得到这一页偏移序号setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount,true);}//进度条滑动改变的数据,进行刷新protected void setPageChanged(int index, boolean isSetProgress) {if (index < 0 || index >= mPagesCount || mCurrentSelectPageIndex == index) return;mCurrentSelectPageIndex = index;// 刷新每一项的索引数据setResetPageItemsIndex(mCurrentSelectPageIndex);// 翻页控件setSelectPageControl(mCurrentSelectPageIndex, mPagesCount, isSetProgress);}//上下按键翻页,需要同时滚动进度条效果.如果只有两页数据,不显示进度条protected void setSelectPageControl(int index, int count, boolean isSet) {View selectPageBar = findViewById(R.id.layoutShow);if (selectPageBar != null) {//如果只有两页数据,不显示进度条if (count <= 1) selectPageBar.setVisibility(View.GONE);else selectPageBar.setVisibility(View.VISIBLE);//上下按键翻页,需要同时滚动进度条效果if (mPageSeekBar != null && isSet == true)mPageSeekBar.setProgressSpecialPage(mCurrentSelectPageIndex, mPagesCount);}}//进度条滑动改变的数据,进行刷新@Overridepublic void setSeekBarPageChanged(int page) {setPageChanged(page, false);}private class ViewHolder{TextView textView;}private class ListViewAdapter extends BaseAdapter{private Context mContext;private LayoutInflater mLayoutInflater;public ListViewAdapter(Context context) {mContext = context;mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return mPageItemsIndex.size();}@Overridepublic Object getItem(int position) {return 0;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vHolder = null;if (convertView == null) {vHolder = new ViewHolder();convertView = mLayoutInflater.inflate(R.layout.listview_item, null);vHolder.textView = (TextView)convertView.findViewById(R.id.textView1);convertView.setTag(vHolder);}else {vHolder = (ViewHolder) convertView.getTag();}vHolder.textView.setText(mArrayList.get(mPageItemsIndex.get(position).intValue()));return convertView;}}}
到这里就结束了,有什么疑问,欢迎评论。。。

下载地址:http://download.csdn.net/detail/qq_16064871/9445535

更多相关文章

  1. 【Android自定义View】Bitmap的绘制和颜色滤镜
  2. Android应用架构演变
  3. Android电量优化
  4. iOS 开发者的 Android(安卓)第一课
  5. Android(安卓)ViewDragHelper实现窗帘效果小挂件
  6. Android缓存数据清理
  7. Android上拉加载的数据层的思考。
  8. Android多功能时钟开发案例(实战篇)
  9. 数据库小白:GROUP BY和ORDER BY不能一起用?

随机推荐

  1. Android常见问题总结(五)
  2. Android Service学习
  3. Android中的进程和线程学习笔记
  4. 将项目从Eclipse转到Android Studio
  5. Android消息机制(Handler原理)
  6. Android消息推送(二)--基于MQTT协议实现
  7. android的手势识别例子
  8. App-Launcher-Cordova-Plugin运行已经安
  9. Android 学习笔记4---签名Android的执行
  10. android:限制文本长度加省略号用ellipsize