您的位置:首页 > 数据库

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));

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: