ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator
详情页,tab下面的详情页和子页面banner是相互抵触的,banner需要处理滑动,父页面在位置0处需要拉出菜单栏,这样产生了矛盾,因此需要进行详细的处理,在banner和其父亲的非banner处分别处理
NewsMenuDetailPager.java详情页滑动的处理
package com.ldw.news.base.menudetails;
import java.util.ArrayList;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.ldw.news.MainActivity;
import com.ldw.news.R;
import com.ldw.news.base.BaseMenuDetailPager;
import com.ldw.news.base.TabDetailPager;
import com.ldw.news.domain.NewsData.NewsTabData;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.event.OnClick;
import com.viewpagerindicator.TabPageIndicator;
/*
* 菜单详情页-新闻
*/
public class NewsMenuDetailPager extends BaseMenuDetailPager implements OnPageChangeListener{
private ViewPager vp_menu_detail;
private ArrayList<TabDetailPager> mPagerList;
private ArrayList<NewsTabData> mNewsTabData;//页签的网络数据
private TabPageIndicator mIndicator;
public NewsMenuDetailPager(Activity activity, ArrayList<NewsTabData> children) {
super(activity);
//接受传过来的children数据,有11个
mNewsTabData = children;
}
@Override
public View initView() {
View view = View.inflate(mActivity, R.layout.news_menu_details, null);
vp_menu_detail = (ViewPager) view.findViewById(R.id.vp_menu_detail);
mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);
//xUtils使用注解
ViewUtils.inject(this, view);
//不是对vp_menu_detail监听而是对mIndicator监听,viewPager。
//vp_menu_detail.setOnPageChangeListener(this);
//ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator
mIndicator.setOnPageChangeListener(this);
return view;
}
@Override
public void initData(){
//数据是通过从服务器中获取大数据来初始化
mPagerList = new ArrayList<TabDetailPager>();
for(int i = 0; i < mNewsTabData.size(); i++){
TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(i));
//添加到链表
mPagerList.add(tabDetailPager);
}
vp_menu_detail.setAdapter(new MenuDetailAdapter());
//在vp_menu_detail设置完成adapter以后才能调用,viewpager和indicator关联
mIndicator.setViewPager(vp_menu_detail);
}
//监听右边的箭头,切换内容,内容+1
@OnClick(R.id.btn_next)
public void nextPage(View view){
int currentItem = vp_menu_detail.getCurrentItem();
vp_menu_detail.setCurrentItem(++ currentItem);
}
class MenuDetailAdapter extends PagerAdapter{
//使用开源的框架PageIndicator初始化标题,重写这个方法设置tab
@Override
public CharSequence getPageTitle(int position) {
return mNewsTabData.get(position).title;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mPagerList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
// TODO Auto-generated method stub
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//初始化页面
TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(position));
//添加view
container.addView(tabDetailPager.mRebootView);
//初始化数据
tabDetailPager.initData();
//显示界面
return tabDetailPager.mRebootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
//页面被选中,这个是对触摸事件的处理,监听触摸事件,只有在滑倒了最左边才会拉出菜单
@Override
public void onPageSelected(int position) {
//获取到左侧的菜单栏
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
if(position == 0){
//当前位置为0的时候可以全屏触摸,可以拉出来菜单栏
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
//不为0的时候不让触摸
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
}
list_header_topnews.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- banner图,继承处理以后的ViewPager,防止父类拦截 -->
<com.ldw.news.view.TopNewsViewPager
android:id="@+id/vp_news"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
<!-- 下方的页签和文本 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:padding="5dp"
android:background="#a000"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="16sp"
android:text=""
/>
<!-- 使用viewpagerindicator实现小圆点 -->
<com.viewpagerindicator.CirclePageIndicator
android:id="@+id/indicator"
android:padding="10dip"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
app:radius="4dp"
app:fillColor="#FF0000"
app:pageColor="@android:color/darker_gray"
app:strokeWidth="2dp"
/>
</RelativeLayout>
</RelativeLayout>
TopNewsViewPager.java 详情页的banner的处理,需要出来几种情形的滑动
package com.ldw.news.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/*
* banner图中不让父亲拦截ViewPager
*/
public class TopNewsViewPager extends ViewPager {
int startX;
int startY;
public TopNewsViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TopNewsViewPager(Context context) {
super(context);
}
/**
* 事件分发, 请求父控件及祖宗控件是否拦截事件
* 1. 右划, 而且是第一个页面, 需要父控件拦截 ,拉出菜单栏
* 2. 左划, 而且是最后一个页面, 需要父控件拦截,这样跳到父亲的下一页
* 3. 上下滑动, 需要父控件拦截,拉出listView,banner只需要处理左右滑动即可
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//滑动事件的处理
switch (ev.getAction()) {
//按下
case MotionEvent.ACTION_DOWN:
//按下的时候先让父亲控件不要拦截
getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,
// 这样是为了保证ACTION_MOVE调用
startX = (int) ev.getRawX();
startY = (int) ev.getRawY();
break;
//滑动
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getRawX();
int endY = (int) ev.getRawY();
//判断是上下滑动还是左右滑动
if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
if (endX > startX) {// 右划
if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
getParent().requestDisallowInterceptTouchEvent(false);
}
} else {// 左划
if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
// 需要拦截
getParent().requestDisallowInterceptTouchEvent(false);
}
}
} else {// 上下滑动
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
--------
public class NewsMenuDetailPager extends BaseMenuDetailPager implements OnPageChangeListener{
private ViewPager vp_menu_detail;
private ArrayList<TabDetailPager> mPagerList;
private ArrayList<NewsTabData> mNewsTabData;//页签的网络数据
private TabPageIndicator mIndicator;
public NewsMenuDetailPager(Activity activity, ArrayList<NewsTabData> children) {
super(activity);
//接受传过来的children数据,有11个
mNewsTabData = children;
}
@Override
public View initView() {
View view = View.inflate(mActivity, R.layout.news_menu_details, null);
vp_menu_detail = (ViewPager) view.findViewById(R.id.vp_menu_detail);
mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);
//xUtils使用注解
ViewUtils.inject(this, view);
//不是对vp_menu_detail监听而是对mIndicator监听,viewPager。
//vp_menu_detail.setOnPageChangeListener(this);
//ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator
mIndicator.setOnPageChangeListener(this);
return view;
}
@Override
public void initData(){
//数据是通过从服务器中获取大数据来初始化
mPagerList = new ArrayList<TabDetailPager>();
for(int i = 0; i < mNewsTabData.size(); i++){
TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(i));
//添加到链表
mPagerList.add(tabDetailPager);
}
vp_menu_detail.setAdapter(new MenuDetailAdapter());
//在vp_menu_detail设置完成adapter以后才能调用,viewpager和indicator关联
mIndicator.setViewPager(vp_menu_detail);
}
//监听右边的箭头,切换内容,内容+1
@OnClick(R.id.btn_next)
public void nextPage(View view){
int currentItem = vp_menu_detail.getCurrentItem();
vp_menu_detail.setCurrentItem(++ currentItem);
}
class MenuDetailAdapter extends PagerAdapter{
//使用开源的框架PageIndicator初始化标题,重写这个方法设置tab
@Override
public CharSequence getPageTitle(int position) {
return mNewsTabData.get(position).title;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mPagerList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
// TODO Auto-generated method stub
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//初始化页面
TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(position));
//添加view
container.addView(tabDetailPager.mRebootView);
//初始化数据
tabDetailPager.initData();
//显示界面
return tabDetailPager.mRebootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
//页面被选中,这个是对触摸事件的处理,监听触摸事件,只有在滑倒了最左边才会拉出菜单
@Override
public void onPageSelected(int position) {
//获取到左侧的菜单栏
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
if(position == 0){
//当前位置为0的时候可以全屏触摸,可以拉出来菜单栏
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
//不为0的时候不让触摸
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
}
阻止ViewPager的滑动NoScrollViewPager.java,重写父类的事件
package com.ldw.beijing.view;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/*
* 不让主页的ViewPager滑动,只让其可以点击
*/
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public NoScrollViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
// 表示事件是否拦截, 返回false表示不拦截,让子view去执行
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return false;
}
/*
* 重写onTouchEvent事件,什么都不用做
*/
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return false;
}
}