viewPager.setPageMargin((int)getResources().getDimensionPixelOffset(R.dimen.ui_5_dip));//设置viewpager每个页卡的间距,与gallery的spacing属性类似


ViewPager更新页面数据问题:

直接使用notifyDataSetChanged是无法更新,需要同时重写getItemPosition返回常量 POSITION_NONE (此常量为viewpager带的)。

下面转载:点击打开链接

一、一种简单的解决方案

       这种方案我相信只要是对ViewPager数据更新问题有研究的都会了解,即覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过getItemPosition()方法返回Item位置失去的参数,这样PagerAdapter误认为Item失去位置,因而重新建立所有childView,这样做来,开销过大,而且由于占用了getItemPosition()方法,也不适用于复杂的View界面,只适合TextView,EditText等简单的View。


覆盖代码:

public int getItemPosition(Object object){   
                 return POSITION_NONE;
          }


二、PagerAdapter的工作机制


        这里所说的工作机制,严格意义上讲就是PagerAdapter的执行顺序,也是Leo8573通过调试自己理解的。

        PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。


简易图示:
                       *
       ------+---+---+---+------
         ... 0 | 1 | 2 | 3 | 4 ...
       ------+---+---+---+------

     当前View为2号View,所以PagerAdapter管辖1、2、3三个View,接下来向左滑动-->

                       *
       ------+---+---+---+------
         ... 1 | 2 | 3 | 4 | 5 ...
       ------+---+---+---+------

     滑动后,当前View变为3号View,PagerAdapter会destroyItem 0号View,instantiateItem 5号View,所以PagerAdapter管辖2、3、4三个View


大概就是这样,各位领会精神吧,Leo8573文字表达能力还是有点差。


三、较通用的解决方案


       所谓通用的方案,即对于任何ViewPager中的View都可以进行数据更新,具体的方法是每当Adapter调用instantiateItem时,运用View.setTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPager.findViewWithTag方法找到相应的View,然后更新View中的数据。不能空说不练,最后给上关键代码,领会精神。


代码示例:

[java]  
1. @Overridepublic Object instantiateItem(ViewGroup container, int position) {  
2. null;  
3. null);  
4.     TextView tvRecord = (TextView) view.findViewById(R.id.tv_record);  
5. "tvRecord" + position;     
6. // 關鍵點,針對要更新的View來設定Tag,主要是在後續使用ViewPager.findViewWithTag()時,可以找到要更新的View  
7.     tvRecord.setTag(key);  
8.     container.addView(view)  
9. return view;}    
10.   
11. // 在後續的應用當中,如果要開始更新View Pager當中某個View的內容時,需要進行下列動作  
12. "tvRecord1");   
13. // 假設要更新第2頁的TextView   
14. // 進行內容更新  
15. if (tvRecord != null ) {    tvRecord.setText("update");  
16. /* end of if */  
17. }