android 打造变化多端的SeekBar(垂直和水平)
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效果
从上而下那个调整画布是这样的,还有一些计算。。。看源码也是继承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
更多相关文章
- 【Android自定义View】Bitmap的绘制和颜色滤镜
- Android应用架构演变
- Android电量优化
- iOS 开发者的 Android(安卓)第一课
- Android(安卓)ViewDragHelper实现窗帘效果小挂件
- Android缓存数据清理
- Android上拉加载的数据层的思考。
- Android多功能时钟开发案例(实战篇)
- 数据库小白:GROUP BY和ORDER BY不能一起用?