viewpager inside viewpager not showing [error]

you cannot generally have scrollable things inside of other scrollable things — they tend to fight over touch events.

mastery of onInterceptTouchEvent is the secret to all nested scrollable views.

1. ScrollView 包着viewPager,viewPager内容不显示问题

解决方法:xml中设置viewPager的高度和宽度.

isViewFromObject

2.能够兼容ViewPager的ScrollView

解决了ViewPager在ScrollView中的滑动反弹问题

public class ScrollViewExtend extends ScrollView {
// 滑动距离及坐标
private float xDistance, yDistance, xLast, yLast;
public ScrollViewExtend(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if(xDistance > yDistance){
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}

3.ScrollView中嵌入ViewPager,ViewPager的滑动出现问题 

在滑动ViewPager进行切换时,必须完全保持水平的滑动。如若进行滑动的时候滑动方向发生了倾斜,就会触发ScrollView的滚动事件,而ViewPager的滑动也会终止并变回原来的样子。怎样才能让在ViewPager进行滑动时ScrollView不滚动?

public class CustomScrollView extends ScrollView {
private boolean canScroll;
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(new YScrollDetector());
canScroll = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_UP)
canScroll = true;
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(canScroll)
if (Math.abs(distanceY) >= Math.abs(distanceX))
canScroll = true;
else
canScroll = false;
return canScroll;
}
}
}

只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常

4.解决ViewPager双层嵌套的滑动问题

ViewFlipper控件有点死板,只能等待你手势执行完毕后才执行滑动效果,用起来很不爽,不过ViewPager可以很容易实现这个效果.但是有个缺陷,也就是在首页时候向左拽,在最后一页向右拽,这两者是没有效果的,而iphone的效果是你拖拽出现一片空的page会自动缩回首页或尾页

5.ViewPager禁止滑动翻页

ViewPager中切换到某一页时禁止当前页滑动到下一页和上一页,可以通过控制Touch事件来实现;

viewPager.setOnTouchListener(this);

public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
if(currentview==3)
{
return true;
}
return false;
}

OnPageChangeListener 里面获取当前的页面值(currentview)

ViewPager嵌套子ViewPager不能滑动

重写父ViewPager,并在父ViewPager重载onInterceptTouchEvent方法,并返回false:
    @Override
public boolean onInterceptTouchEvent(MotionEvent motionEvent ) {
return false;
}
这样,子ViewPager就能滑动了。

viewpager上下滑动

为了实现左右滑动和上下滑动的灵活性,在ViewPager子类里实现了自定义的手势GestureDetector。

测试时,在一个商品上不停的点击、进入浏览器、返回、再点击、再返回,连续三、四次之后,就被困在一个ViewPager页面里出不来了,左右滑动失灵。并且能够屡次重现。

后来在能加Log的地方都加上Log,一句一句的跟踪,发现是LongPress造成的,ViewPager如果接收了LongPress事件,左右滑动立马失灵。

增加了一行代码:mGestureDetector.setIsLongpressEnabled(false);

将LongPress禁用。一切恢复正常。

ListView在ViewPager中导致左右滑动失效

下面是GestureDetector 这个类的概括情况

  • 首先,Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,就是通过onTouchListener实现;
  • 其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的Listener
  • 第三,Listener一般会以Interface的方式来提供,其中包含一个或多个abstract方法,我们需要实现这些方法来完成onTouch()、onKey()等操作。这样,程序便可以在特定的事件被dispatch到该view的时候,通过callback函数给予适当的响应。

根据 MotionEvent事件检测各种手势,通过MotionEventgetAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。

当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?

Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。

GestureDetector.OnGestureListener 回调函数用于通知用户发生的手势动作。该类仅处理MotionEvent 事件中的触摸事件(不处理轨迹球事件)。 使用该类的方法如下:

首先需要在初始化的时候创建GestureDetector对象实例:

  • 接口 OnDoubleTapListener 手势监听器 用于双击时发出通知
  • 接口 OnGestureListener 手势监听器 用于发送手势操作时发生通知 如 拖动,长按,按下,弹起 等手势操作
    • onDown(MotionEvente)  //当轻触手势按下屏幕 时发生的事件
    • onFling(MotionEvent e1, MotionEvente2, float velocityX, float velocityY) //快速滑动后抬起事件的通知.由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
    • onLongPress(MotionEvente) //长按时的通知事件,由多个MotionEvent ACTION_DOWN触发
    • onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)  //滑动屏幕时通知事件 为了方便提供了X轴和Y轴上的滚动距离.由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
    • onShowPress(MotionEvente)  //当用户长点击后抬起时通知事件,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
    • onSingleTapUp(MotionEvente)  //当轻触手势抬起屏幕时发生的事件.由一个1个MotionEvent ACTION_UP触发
  • SimpleOnGestureListener – GestureDetector的扩展类 这个类的作用是当我们只想使用部分手势时, 而非全部的时候 就可以继承这个类

在实际应用中 我们根据我们所需要的功能实现不同的接口 或者 继承自SimpleOnGestureListener 类,只实现部分个人需要的方法 就可以了

[error] NullPointerException in custom adapter getView

NullPointerException in custom adapter getView

 

Change this:

vi = inflater.inflate(R.layout.result_list_item, null);

To this:

vi = inflater.inflate(R.layout.result_list_item, parent, false);

NullPointerException using custom array adapter

I finaly got it.. I changed this View rowView = inflater.inflate(R.layout.rowlayout, parent, false); to this: View rowView = inflater.inflate(R.layout.listinflate,null); Im always confuse of using inflater.. the listinflate file contains the textview while the rowlayout contains the listview. Thats why i got nullpointer cause i use rowlayout.. i change the parent,false to null..

Android custom adapter getView() NullPointerException out of nowhere!

So, that's solved. I tried rebulding, cleaning project. Then I deleted it from workspace and reopened - it worked. That is Eclipse bug, that's horrible, I wasted couple of hours! Thanks to all for responses! Sorry for disturbing...

Android ViewPager children not shown when instantiated using a composite widget rather than an inflated layout

I am unable to instantiate it as a child in a ViewPager. If I however, inflate the layout without the widget wrapper, it works.

Solved it, realised I was inflating it at the wrong event, it should be done in the constructor. Heres the right code:http://pastebin.com/hYDhXxdp

Nesting Android ViewPager, Swiping ListItems inside a ListView horizontally

ViewPager on the root-level of an activity. Each page of the pager contains a ListFragment (backed by a FragmentPagerAdapter).

 

为ViewPager设置监听器-内部控件+viewpager本身

viewPager = (ViewPager) findViewById(R.id.guide_view);    

        viewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器    
        // 设置一个监听器,当ViewPager中的页面改变时调用    
        viewPager.setOnPageChangeListener(new MyPageChangeListener());
/页面切换的监听器
	class pagerViewListener implements OnPageChangeListener{		
		//三种状态,0为空闲,1为滑动,2为加载完毕		
		@Override
		public void onPageScrollStateChanged(int arg0) {
//arg0 ==1的时候表示正在滑动,arg0==2的时候表示滑动完毕了,arg0==0的时候表示什么都没做,就是停在那。
			// TODO Auto-generated method stub			
		}		
		//界面1滑动到界面2,在界面1滑动前调用
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			// TODO Auto-generated method stub 表示在前一个页面滑动到后一个页面的时候,在前一个页面滑动前调用的方法。		
		}
		//从界面1到界面2,2页加载后调用...
		@Override
		public void onPageSelected(int arg0) {//arg0是表示你当前选中的页面,这事件是在你页面跳转完毕的时候调用的。
			// TODO Auto-generated method stub
		}		
	}

/** 指引页面改监听器 */
class GuidePageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
//Log.i(“voice”, arg0+ “————-onPageScrollStateChanged”);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-geneLog.i(“voice”, arg0+ ” ” + arg1 +”  ” + arg2  +”————-onPageScrolled”);
//              if(currPage==5){
//                  HelpActivity.this.finish();
//              }rated method stub
}

@Override
public void onPageSelected(int arg0) {
currPage = arg0;
for (int i = 0; i < imageViews.length; i++) {
imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
if (arg0 != i) {
imageViews[i].setBackgroundResource(R.drawable.page_indicator);
}
}

}
mPager = (ViewPager) findViewById(R.id.vPager);
mPager.setAdapter(new MyPagerAdapter(listViews));
mPager.setOnPageChangeListener(new MyOnPageChangeListener());

viewpager中嵌套viewpager – 跳转到另一个viewpager,rather set one inside the other

  • Set the listener on the image inside instantiateItem():
@Override
        public Object instantiateItem(View collection, int position) {
            final LayoutInflater inflater = getLayoutInflater(); 
            View layout = inflater.inflate(R.layout.my_layout, null);
            final ImageView image = (ImageView)layout.findViewById(R.id.image_display);
            final int cPos = position;
            image.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    ImageView i = (ImageView)v; //The "v" in "public void onClick(View v)" is the image that was clicked. A new OnClickListener is set directly on each ImageView.
                    if(cPos == 0)
                    {
                        //...
                    }
                    //...
                }
            });
            return layout;
        }

Alternatively, you could use the ImageView.setTag() method to include data about what Activity to launch. e.g.

I have an ImageView with onTouchListener inside a ViewPager. Of course the ImageView‘s listener fires off when I try to change ViewPager‘s page. Is there a way to prevent it. I guess I need to recognize touch from swipe somehow.
解决ViewPager嵌套后子ViewPager不能滑动的方法
重写父ViewPager,并在父ViewPager重载onInterceptTouchEvent方法,并返回false,具体是:
@Override
public boolean onInterceptTouchEvent(MotionEvent motionEvent ) {
return false;
}   

这样,子ViewPager就能滑动了。
在删除或者修改数据的时候,PagerAdapter无法像BaseAdapter那样仅通过notifyDataSetChanged方法通知刷新View。

  • 针对于child view比较简单的情况:可以在自己的Adapter中加入代码:public int getItemPosition(Object object) {   return POSITION_NONE; } //调用 notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,这种情况下,所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于 只是希望更新child view内容的时候,造成了完全不必要的开销。
  • 更有效地方法:更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。

ScrollView中嵌入ViewPager,ViewPager的滑动出现问题:

在滑动ViewPager进行切换时,必须完全保持水平的滑动。如若进行滑动的时候滑动方向发生了倾斜,就会触发ScrollView的滚动事件,而ViewPager的滑动也会终止并变回原来的样子。怎样才能让在ViewPager进行滑动时ScrollView不滚动。试过重写ScrollView的onTouchEvent,但是没有效果。

ViewPager 嵌套在另外一个 ViewPager 中

左右滑动的时候只能切换最外层的 ViewPager,在有子ViewPagger的时候,左右滑动 是对这个 子VIewPager进行滑动,而不是外层的ViewPager

 

 

Adapter的适用范围

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  — 《设计模式》GOF
Adapter模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。—《java设计模式 》

适配器是AdapterView视图与数据之间的桥梁,用来处理数据并将数据绑定到AdapterView上。AdapterView对象有两个主要任务
1. 在布局中显示数据
2. 处理用户的选择

android提供多种适配器,开发时可以针对数据源的不同采用最方便的适配器,也可以自定义适配器完成复杂功能。

  • BaseAdapter一般的适配器基类可用于将数据绑定到listview、Gallery、GridView 、spinner、AutoCompleteTextView上,当然也可以绑定到ExpandableListView
  • BaseExpandableListAdapter可扩展的适配器基类,可用于将数据绑定到支持展开/收缩功能的列表控件ExpandableListView上,ExpandableListView继承自ListView
  • 当数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui如果仅仅为了显示则使用baseadapter更节省资源

  • ListView控件是竖向滑动的,复用convertView,我们可以加载成千上万的数据; 我们想横向滑动的相册,并且数据有好多,这时候ViewPager控件。
  • ViewPager和ViewFlipper用法类似,但是更好用,左右滑动效果好,而且有类似于ListView的Adapter—PagerAdapter基类,提供回收内存,复用
    • void destroyItem(View container, int position, Object object)//左右滑动的时候,回收较早前的itemView.
    • int getCount()  //ViewPager里显示内容的条数.
    • Object instantiateItem(View container, int position) //初始化ItemView.
  • 设置ViewHolder 为static,也就是静态的,静态类只会在第一次加载时 会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。

使用国际化接口 字符数组来 给ArrayAdapter 赋值

<string-array name=”letter”>
<item>A</item>
<item>B</item>
<item>C</item>
<item>D</item>
</string-array>

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.letter,android.R.layout.my_list_item)//只需要显示

ArrayAdapter<CharSequence> adapter = new ArrayAdapter(this,android.R.layout.my_list_item,Arrays.asList(getResources().getTextArray(R.array.letter)))//允许动态增删

在自定义ListView的样式时,需要重写数据接口的ListAdapter类中的getView函数,以此来定制ListView中每个item的样式。当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。在ListView滑动的过程中,每次getView被执行都会new出一个View对象,长此以往会产生很大的消耗,特别当item中还有Bitmap等 甚至会造成OOM的错误导致程序崩溃

在这里Android系统为了效率的原因引进了ConvertView这一个变量。

  • ConvertView是个view 的缓存,优化:如果存在就不需要重新创建了,没有的话需要通过inflate方法获取。 这样就避免了反复创建大量view的问题。当ListView滑动的过程中,会有item被滑出屏幕而不再被使用,这时候Android会回收这个条目的view 这个view也就是这里的convertView

根据getView调用时间顺序,依次保存convertView。当下一次ListView重写UI,按先进后出的顺序传递给getView函数。

  • Viewholder是个自定义静态类,通过gettag()/settag()convertview关联起来,作用是减少findViewById的次数。因为findViewById会消耗大量时间。
  • View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。

android 平滑切换屏幕Gallery、HorizontalScrollView、ViewFilpper、ViewFlow、ViewPager

1. ViewFlipper + GestureDetector = 用ViewSwitcher+ 动画效果

android手势识别ViewFlipper触摸动画

ViewFlipper主要用来实现View的自动切换。该类提供了如下几个主要的方法:

  • setFilpInterval:设置View切换的时间间隔。参数为毫秒。
  • startFlipping:开始进行View的切换,时间间隔是上述方法设置的间隔数。切换会循环进行。
  • stopFlipping:停止View切换。
  • setAutoStart:设置是否自动开始。如果设置为“true”,当ViewFlipper显示的时候View的切换会自动开始。

一般情况下,我们都会使用ViewFilpper类实现View的切换,而不使用它的父类ViewAnimator类。

1.1 实现滑动—GestureDetector介绍

如果想要实现滑动翻页的效果,就要了解另外一个类:android.view.GestureDetector类。GestureDetector类中可以用来检测各种手势事件。该类有两个回调接口,分别用来通知具体的事件:

  • GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于PC上面的鼠标的双击事件。
  • GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有六个回调方法,具体的可以查看API。这里想要实现滑动的判断,就需要用到其中的onFling()方法

2.Viewflow

viewflow 是 Android 平台上一个视图切换的效果库, 相当于 Android UI 部件提供水平滚动的 ViewGroup使用 Adapter 进行条目绑定。文档上说,当你需要在一系列不确定数目的view中滑动时,可以考虑使用ViewFlow。如果你的view数目确定,你应该使用Fragments 或兼容库里的ViewPager 

3. 自己重写ViewGroup来管理view

创新源于模仿之三:实现左右两个屏幕的切换

4. 对Gallery循环滑动,其实就是对继承自BaseAdapter的类进行操作.

Gallery循环滑动原理

5. HorizontalScrollView

Gallery每次切换图片时都要新建视图,造成太多的资源浪费,当新建项目的API最低为8,其实Gallery这个类已经过期。

The type Gallery is deprecated.This widget is no longer supported. 
ther horizontally scrolling widgets include HorizontalScrollView and ViewPager from the support library.

hsv.jpgHSVDemo.rar

图片中使用了两个HorizontalScrollView,排成上下两行,每行均类似于之前gallery的效果。数据源一行在App的drawable包中,一行在sdcard中,sdk中的图片要自己找了拷进去

5.利用系统自带的ViewPager

ViewPager来源于google 的补充组件android-support-v4.jar, ViewPager类提供了多界面切换的新效果。新效果有如下特征:

  • 当前显示一组界面中的其中一个界面。
  • 用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分
  • 滑动结束后,界面自动跳转到当前选择的界面中

ViewPager提供了一个适配器,方便我们对各个View进行控制,而Workspace需要我们手动去添加,它相当于是一个”静态切换”。使用步骤:

  • 写一个ViewPager的专用Adapter,要继承PagerAdapter, 实现如下方法:

 private class AwesomePagerAdapter extends PagerAdapter{  getCount(), instantiateItem(), destroyItem(), isViewFromObject() }

  • 其后,把你需要展示出来的每一个页面也就是每一个View放到一个ArrayList里面保存起来。传过去给Adapter;
  • 最后把ViewPager实例化,也就是findViewById()。接着就调用ViewPager的setAdapter就OK了

awesomeAdapter = new AwesomePagerAdapter();
awesomePager = (ViewPager) findViewById(R.id.awesomepager);
awesomePager.setAdapter(awesomeAdapter);
mListViews = new ArrayList<View>();
mInflater = getLayoutInflater();//LayoutInflater作用是将layout的xml布局文件实例化为View类对象
mListViews.add(mInflater.inflate(R.layout.layout1, null));
mListViews.add(mInflater.inflate(R.layout.layout2, null));
mListViews.add(mInflater.inflate(R.layout.layout3, null));

6.双向滚动ScrollView

结论

ViewFlipper + Webview——WebView本身的onTouchEvent和ViewFlipper有冲突;

ViewPager + TabhostViewPager多页面滑动切换以及动画效果

ViewPager + ListView

ViewPager+GridView实现GridView左右滑动翻页,实时动态读取数据

ViewFilpper使用时主要是在有限的少数页面切换中比较合适,并且能够自定义每一个切换动画,用于一个应用间的画面切换比较合适,类似于ActivityGroup;

ViewPager与ViewFlow都能够使用适配器进行大量数据的适配。ViewFlow 适用于不确定数目的view中滑动;

ViewFlow由于提供源码,所以在扩展性上更强,可根据需要自行定制,比如加入循环播放等。

ViewPager左右上下滑动Actionbar

谷歌官方提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api,而viewpager就是其中之一。利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片:

ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。

Launcher俗称HomeScreen,也就是我们启动Android手机,第一眼看到的应用程序,而这个应用程序是比较特殊而且任务艰巨的。它负责了我们除了应用本身操作以外的所有操作,它负责了我们有几个桌面,点击应用图标启动应用程序,长时间按桌面出现上下文菜单,长时间按桌面的图标出现垃圾箱,拖动应用图标重新定位等等,一系列的操作。

分三个步骤来使用ViewPager:

1.住布局文件里加入

<android.support.v4.view.ViewPager //这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。
android:id=”@+id/viewpager”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center” >
2..加载要显示的页卡
LayoutInflater lf = getLayoutInflater().from(this);
view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);

viewList = new ArrayList();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);

3.在Activity里实例化ViewPager组件并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter

从上面的图片可以看到,ViewPager的适配器是PagerAdapter,它是基类提供适配器来填充页面ViewPager内部,你很可能想要使用一个更具体的实现,如FragmentPagerAdapter或FragmentStatePagerAdapter。在这里需要说明一下,其实ViewPager应该和Fragment一起使用,至少谷歌官方是这么想的,但是在3.0之下,我们没有必要这么做。

下面要注意,当你实现一个PagerAdapter,你必须至少覆盖以下方法:

从上面的例子中可以看到,我们最少也是实现了上面四个方法,当然如果你想让程序更健壮或是功能更全面,你可以重写其他的方法。

所以总结一下,我们可以使用ViewPager做什么:

1.程序使用导航,外加底部圆点的效果,这个在微信示例里介绍了
2.页卡滑动,加上菜单的效果,不管是之前的支持手势也支持底部图标点击的微信,还是今天的微博。

横向滑动使用ViewPager作为父容器,纵向上下滑动使用自定义的ViewPager

纵向滑动的ViewPager:通过继承ViewGroup,实现上下滑动的效果

开源项目 GitHub地址

1 垂直横向滑动ViewPager:https://github.com/JakeWharton/Android-DirectionalViewPager

Google的ViewPager只能横向滑动,此工程可以纵向滑动,横向滑动。但是jar好像有问题下载最新的。解决问题连接:http://stackoverflow.com/questions/10720276/error-including-android-directionalviewpager-jar-in-eclipse

 2 下拉刷新ListView pulltorefreshlistview:https://github.com/fanfoudroid/fanfoudroid

很常见了下拉ListView实现刷新数据

3 ActionBarSherlock:  http://actionbarsherlock.com/index.html

ActionBarSherlock 是Android compatibility libraryandroid-support-v4.jar的一个扩展, 不知道什么原因 Android 兼容开发包没有包含ActionBar. 所以就有了ActionBarSherlock . 其使用方式和 兼容开发包类似.

Android Compatibility Package(最新版本r4改名叫做了Support Package)

这个Package主要是提供了较早平台版本不支持的一些API。目的是为了使程序员较少关注平台版本,而写出前向兼容的程序。比如http://code.google.com/p/iosched/这个应用就是使用的Compatibility Package。Package主要是加入了平板平台引入的一些API的支持,如Fragment,Loader等,主要的类有:

  • Fragment
  • FragmentManager
  • FragmentTransaction
  • ListFragment
  • DialogFragment
  • LoaderManager
  • Loader
  • AsyncTaskLoader
  • CursorLoader

Fragment介绍

Fragment是在Android 3.0引入的

Loader介绍

Loader用来异步加载数据,现在很多应用都是基于请求服务器获取数据,然后客户端不过是个前端展示应用。里面有大量的Web请求,写起来很麻烦。Loader封装了看起来不错的接口

Action Bar介绍

Action Bar是活动中的一种控件,用以代替传统的屏幕顶端的标题栏。默认Action Bar包括了左侧的应用程序图标(logo),其右是活动的标题,以及Option Menu中的可选项目

Action Bar在Android 3.0及以上的活动中是默认被包含的。更为具体地说,所有使用了新的“holographic”主题的活动将包含Action Bar,而任何以Android 3.0为目标平台的应用程序将自动使用该主题。当一个应用程序在<uses-sdk>元素中设置了android:minSdkVersionandroid:targetSdkVersion属性为“11”或更高时,被认为是以Android 3.0为目标平台的。e.g:

<uses-sdk android:minSdkVersion="4"
              android:targetSdkVersion="11" />
程序请求了最小API等级为4(Android 1.6),而目标API等级为11(Android 3.0)。这样,当程序安装于运行Android 3.0或是更高版本的设备上时,系统将为每一个活动提供holographic主题,因而每个活动都将包含Action Bar。
  • 使用Action Bar的API时,例如添加标签或是修改Action Bar风格,就需要将android:minSdkVersion设为“11”,这样才能使用ActionBar类
  • 如果希望从某个指定的活动中移除Action Bar,只需将该活动的主题设为Theme.Holo.NoActionBar。例如:
<activity android:theme="@android:style/Theme.Holo.NoActionBar">

提示:如果希望从一个自定义的主题中移除Action Bar,只需将android:windowActionBar样式属性设为false。

  • 还可以在运行时通过调用hide()来隐藏Action Bar,之后通过调用show()来再次显示它。例如:
ActionBar actionBar = getActionBar();
actionBar.hide();
  • 当Action Bar隐藏时,系统将调整活动的内容来填充可用的屏幕空间注意:如果移除了使用主题的Action Bar,那么该窗口将完全禁用Action Bar而无法再在运行时添加——调用getActionBar()将返回null
  • 添加action item:动作项目仅仅是Option Menu中被声明要直接显示在Action Bar上的菜单项目。一个动作项目可以包括一个图标和/或文本。如果一个菜单项目不是动作项目,那么系统将把它放在浮动式菜单中,用户可以通过选择Action Bar右侧的菜单图标打开浮动式菜单。动作项目默认只显示图标


Action Bar提供了多种便利特性,包括:

  • 直接在Action Bar中显示Option Menu中的项目,称之为“动作项目(action item)”——以提供对于关键用户操作的快速选择。没有作为动作项目显示的菜单项目则位在浮动式菜单中,通过Action Bar的下拉列表显示
  • 提供在不同片段之间的导航标签
  • 提供导航用的下拉列表
  • 提供交互式的“动作视图(action view)”以代替动作项目(例如搜索框)。

现在的Google更新的手机设备App的UI风格基本上都是Action Bar左右滑动ViewPager。android兼容包没有提供Action Bar的兼容类,但是官方有个Demo

via 动作栏(Action Bar):http://leybreeze.com/blog/?p=1058

http://blog.qhm123.com/2011/11/28/Android-compatibility-package-fragment-loader-actionbar.html

Android ViewPager使用详解

 

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

John's Weblog

Just another WordPress.com weblog

I Am That I Am

Chasing tomorrow's sunrise.