viewpager动态绑定数据库数据,并支持动态左右滑动
2013-11-01 13:31
453 查看
* 分析:
* 1.模拟从数据库中取数据,数据库中有N条数据,不可能一次性全加载到viewpager中,只能动态绑定viewpager数据
* 2.从数据库取数据,放在viewpager上显示,这条数据可能是N条数据中的任意一个,所以viewpager需要支持向右滑动加载,也要支持向左滑动加载
* 3.数据分析 p---a-b-c-d-e---n,比如说前面的字母代表数据的位置,若当前显示的数据是C,在显示c的同时,左侧的b和右侧的c需预先加载出来,才可能实现viewpager向左滑或向右滑
* 4.继续比如,viewpager已经加载了a/b/c/d/e共5个页面,当页面滑动到a的时候,也就是position==0时,需要预加载p并放在集合中,但是必须在a的前面,这样a的下标会改变成1,所以我们需要再为viewpager指定下当前的item等于1,即可实现动态加载p并向左滑动
* 5.viewpager已经加载了a/b/c/d/e共5个页面,当页面滑动到e的时候,也就是position==(viewpager的size-1)时,需要预加载n并放到集合中,放在e的后面即可,这样viewpager在滑动到e的时候可以继续向右滑动
*******************所有代码(注:布局文件狠简单,1个mainactivity.xml,2个默认布局文件,1个viewpager的page文件(就一个textview)不提上来了)*******
public class MainActivity extends Activity {
private ViewPager viewpager;
private List<View> lstView;
private ViewPagerAdapter adapter;
private int CurrentPageIndex=0;//当前页面下标
private int nextDB=5;//需加载的下一条数据库数据位置
private int preDB=5;//需加载的上一条数据库数据位置
private int maxDB=10;//数据库数据最大条数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager=(ViewPager)findViewById(R.id.viewpager);
initViews();//初始化数据
adapter=new ViewPagerAdapter();
viewpager.setAdapter(adapter);
viewpager.setOnPageChangeListener(new OnPagerChangeListener());
loadNextPage();
loadPrePage();
}
/**
* 初始化当前页面的数据
*/
private void initViews(){
lstView=new ArrayList<View>();
View view=LayoutInflater.from(this).inflate(R.layout.page, null);
//动态为组件赋值
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+nextDB+"页");
lstView.add(view);
nextDB+=1;
}
/**
* 加载下一页数据
*/
private void loadNextPage(){
if(CurrentPageIndex==lstView.size()-1){
if(nextDB>(maxDB+1)){
//数据库中无数据了,不需要继续加载下一页
return;
}
View view=null;
if(nextDB==(maxDB+1)){
//刚好数据库中的最后一条也显示了,需要加载默认页面提示用户
view =LayoutInflater.from(this).inflate(R.layout.lastpage, null);
}else{
//在LstView最后追加一个页面
view =LayoutInflater.from(this).inflate(R.layout.page, null);
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+nextDB+"页");
}
lstView.add(view);
nextDB+=1;
}
}
/**
* 加载上一页数据
*/
private void loadPrePage(){
if(CurrentPageIndex==0){
if(preDB<=0){
//数据库中无数据了,不需要继续加载上一页
return;
}
preDB-=1;
View view=null;
if(preDB==0){
//刚好数据库中的第一条也显示了,需要加载默认页面提示用户
view =LayoutInflater.from(this).inflate(R.layout.firstpage, null);
}else{
//在LstView前面追加一个页面
view =LayoutInflater.from(this).inflate(R.layout.page, null);
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+preDB+"页");
}
lstView.add(0,view);
adapter=new ViewPagerAdapter();
viewpager.setAdapter(adapter);
//因集合下标发生了变化,当前页面的下标需要变动
CurrentPageIndex=1;
viewpager.setCurrentItem(CurrentPageIndex,false);
}
}
/**
* ViewPager滑动监听事件
*/
class OnPagerChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
CurrentPageIndex=arg0;
loadNextPage();
loadPrePage();
}
}
/**
* 自定义ViewPager适配器
*/
class ViewPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return lstView.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(lstView.get(position));
return lstView.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(lstView.get(position));
}
}
}
* 1.模拟从数据库中取数据,数据库中有N条数据,不可能一次性全加载到viewpager中,只能动态绑定viewpager数据
* 2.从数据库取数据,放在viewpager上显示,这条数据可能是N条数据中的任意一个,所以viewpager需要支持向右滑动加载,也要支持向左滑动加载
* 3.数据分析 p---a-b-c-d-e---n,比如说前面的字母代表数据的位置,若当前显示的数据是C,在显示c的同时,左侧的b和右侧的c需预先加载出来,才可能实现viewpager向左滑或向右滑
* 4.继续比如,viewpager已经加载了a/b/c/d/e共5个页面,当页面滑动到a的时候,也就是position==0时,需要预加载p并放在集合中,但是必须在a的前面,这样a的下标会改变成1,所以我们需要再为viewpager指定下当前的item等于1,即可实现动态加载p并向左滑动
* 5.viewpager已经加载了a/b/c/d/e共5个页面,当页面滑动到e的时候,也就是position==(viewpager的size-1)时,需要预加载n并放到集合中,放在e的后面即可,这样viewpager在滑动到e的时候可以继续向右滑动
*******************所有代码(注:布局文件狠简单,1个mainactivity.xml,2个默认布局文件,1个viewpager的page文件(就一个textview)不提上来了)*******
public class MainActivity extends Activity {
private ViewPager viewpager;
private List<View> lstView;
private ViewPagerAdapter adapter;
private int CurrentPageIndex=0;//当前页面下标
private int nextDB=5;//需加载的下一条数据库数据位置
private int preDB=5;//需加载的上一条数据库数据位置
private int maxDB=10;//数据库数据最大条数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager=(ViewPager)findViewById(R.id.viewpager);
initViews();//初始化数据
adapter=new ViewPagerAdapter();
viewpager.setAdapter(adapter);
viewpager.setOnPageChangeListener(new OnPagerChangeListener());
loadNextPage();
loadPrePage();
}
/**
* 初始化当前页面的数据
*/
private void initViews(){
lstView=new ArrayList<View>();
View view=LayoutInflater.from(this).inflate(R.layout.page, null);
//动态为组件赋值
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+nextDB+"页");
lstView.add(view);
nextDB+=1;
}
/**
* 加载下一页数据
*/
private void loadNextPage(){
if(CurrentPageIndex==lstView.size()-1){
if(nextDB>(maxDB+1)){
//数据库中无数据了,不需要继续加载下一页
return;
}
View view=null;
if(nextDB==(maxDB+1)){
//刚好数据库中的最后一条也显示了,需要加载默认页面提示用户
view =LayoutInflater.from(this).inflate(R.layout.lastpage, null);
}else{
//在LstView最后追加一个页面
view =LayoutInflater.from(this).inflate(R.layout.page, null);
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+nextDB+"页");
}
lstView.add(view);
nextDB+=1;
}
}
/**
* 加载上一页数据
*/
private void loadPrePage(){
if(CurrentPageIndex==0){
if(preDB<=0){
//数据库中无数据了,不需要继续加载上一页
return;
}
preDB-=1;
View view=null;
if(preDB==0){
//刚好数据库中的第一条也显示了,需要加载默认页面提示用户
view =LayoutInflater.from(this).inflate(R.layout.firstpage, null);
}else{
//在LstView前面追加一个页面
view =LayoutInflater.from(this).inflate(R.layout.page, null);
TextView tvData=(TextView)view.findViewById(R.id.tv_page);
tvData.setText("第"+preDB+"页");
}
lstView.add(0,view);
adapter=new ViewPagerAdapter();
viewpager.setAdapter(adapter);
//因集合下标发生了变化,当前页面的下标需要变动
CurrentPageIndex=1;
viewpager.setCurrentItem(CurrentPageIndex,false);
}
}
/**
* ViewPager滑动监听事件
*/
class OnPagerChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
CurrentPageIndex=arg0;
loadNextPage();
loadPrePage();
}
}
/**
* 自定义ViewPager适配器
*/
class ViewPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return lstView.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(lstView.get(position));
return lstView.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(lstView.get(position));
}
}
}
相关文章推荐
- ViewPager+Fragment实现支持左右滑动的Tab
- Android ViewPager无限滑动(支持左右,存在传入数量限制)方式二
- Android ViewPager动态向前向后加载数据,自定义viewPager滑动速度
- Android:详情界面左右滑动看更多,ViewPager动态添加Fragment,仿51job详情界面
- Android ViewPager无限滑动(支持左右,无传入数量限制)方式一
- ViewPager实现淘宝天面首页广告栏,支持左右滑动,自动滑动,带圆点指示器
- ViewPager左右滑动页面,下面的按钮跟着动态变化
- ViewPager实现淘宝天面首页广告栏,支持左右滑动,自动滑动,带圆点指示器
- ViewPager动态开启和禁用左右滑动功能
- Viewpager设置滑动速率以及外部按钮控制viewpager的左右切换
- 自定义的带tab的可左右滑动的viewpager之二viewpager与fragment不兼容
- 使用Using System.Data.OleDb; 连接数据库,又一种动态绑定GridView显示数据。
- Android ViewPager简单实现 - 倒计时、引导页左右滑动
- viewpager左右滑动的 +Tab指示(方式4-------------ViewPager+ViewPagerIndicator)
- android viewpager 无限左右滑动
- 顶部动态列表GridView+底部viewpager+fragment切换滑动
- ViewPager实现左右滑动2014.08.31
- Fragment+ViewPager实现左右滑动
- viewpager禁用左右滑动
- ActionBar(7) ActionBar+ViewPager+Fragment 实现可左右滑动的Tab页布局