ListView嵌套ViewPager的小demo讲解

来源:互联网 发布:知乎 三国演义感觉 编辑:程序博客网 时间:2024/05/01 04:37

        android学习已经有一段时间了,也看了不少人分享的例子。今天终于鼓起勇气,写下第一篇我的分享,也就是我的处女作,请大家多多指教。

-----------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------------- 

        言归正传,今天我要介绍的是listview嵌套viewpager,例如网易新闻app他展示的效果就可以用这个技术来实现。

       建议先下载源码https://github.com/arvinljw/listviewWithViewpager,里边有自认为比较详细的注解,下面会展示应该注意的地方:

      1、为了避免ListView和ViewPager滑动上的冲突,我们需要重写ListView或者重写ViewPager,再在我们的布局文件中来使用,我在我的demo中是用重写了ListView,重写viewpager的代码如下:

class MyViewPager extends ViewPager {  
 
    public MyViewPager(Context context) {  
        super(context);  
    }  
      
    public MyViewPager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    public boolean dispatchTouchEvent(MotionEvent ev) {  
        getParent().requestDisallowInterceptTouchEvent(true);//这句话的作用 告诉父view,我的单击事件我自行处理,不要阻碍我。    
        return super.dispatchTouchEvent(ev);  
    }  

    2、当listView中的item类型超过一项时,需要重载下面两个方法

        @Override
  public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position > 0 ? 0 : 1;
}

    3、我们不能在getview的时候才去申明viewpager,绑定onpagechangedListenner事件,这样会导致监听无效。在我的demo中是将申明等一系列动作放在了构造函数里边。

    4、在实现viewpager自动轮播的时候,使用的是scheduledExecutorService,功能效果类似于大家熟悉的timer,但是都说比timer要好。实现方式也很简单,代码如下:

scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();//这个是获取ScheduledExecutorService对象
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1002;
currentItem = (currentItem + 1) % imageViews.size();
handler.sendMessage(msg);
}
}, 3, 5, TimeUnit.SECONDS);//最后一个参数定义的是单位,3指的是从第三秒开始执行,5是指每隔5秒执行一次。当然也有相应的handler来接受这个message。代码如下:

            handler = new Handler() {
@Override
public void handleMessage(final Message msg) {
if (msg.what == 1002) {
adsViewPager.setCurrentItem(currentItem);
}
};
};

         5、在MylistAdapter中最重要的实现数据绑定的方法就是getview,代码如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position == 0) {//当position为0 的时候说明是第一项,此时我们的需求就是在此时加载进我们的viewPage,这个实在我们的构造函数中定义的,在第三条中有解释为什么不放在这里。
convertView = mViewPage;
return convertView;
} else {
convertView = mInflater.inflate(R.layout.list_item, null);//这就是简单的自定义view实现的方式了,只是多了一个条件就是position>=1,所以设置数据的时候我们应该需要讲position-1来绑定。这个应该很好理解为什么吧,因为我们第一项数据开始整体往后挪了一位。
TextView tv_item = (TextView) convertView
.findViewById(R.id.tv_item);
tv_item.setText(mList.get(position - 1).get("data").toString());
}
return convertView;
}

     补充,在position==0的时候其实出了放上viewpager之外还可以放上一个别的view,即一个自定义的布局文件。我相信看完这个demo后汗一个自定义的布局文件就不在话下了。

    最后如果还有什么地方没有解释清楚的,或者大家还有什么疑问的可以留言,我会及时回复的。也请大家多多指教!!!       

1 0
原创粉丝点击