viewpager动态绑定数据库数据,并支持动态左右滑动

来源:互联网 发布:iphone 没有4g网络 编辑:程序博客网 时间:2024/06/11 07:24


 * 分析:
 * 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));
  }
 }
}

 

原创粉丝点击