智慧北京第三天

1.VIewpagerIndicator 的使用 (tab栏 )

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <com.viewpagerindicator.TabPageIndicator
            android:id="@+id/titles"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageButton
            android:id="@+id/btn_next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:background="@drawable/news_cate_arr"
            android:padding="5dp" />
    </LinearLayout>

    <com.example.newbj.view.HorizonViewPager
        android:id="@+id/vp_menu_detail"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    ① xml中放置在viewpager的上方  

    ② 将viewPager 和 TabPageIndicator关联 (注意.必须先设置好Viewpager的适配器)

<span style="white-space:pre">		</span>mviewPager.setAdapter(detailadapter);
		
		//必须在VIewPager设置adapter之后才能调用ViewpagerIndicator
		mIndicator.setViewPager(mviewPager);
   ③在adapter中设置 TabPageINdicator的标题文字

		@Override
		public CharSequence getPageTitle(int position) {
			// TODO Auto-generated method stub
			return newsTabData.get(position).title;
		}


2.VIewpagerIndicator的样式自定义设置

①.改变所依附的Activity的样式

<span style="white-space:pre">	</span><activity
            android:name="com.example.newbj.MainActivity"
            android:theme="@style/Theme.PageIndicatorDefaults" >
        </activity>
②.进入them中改变 文字样式大小 和 背景 

 <style name="Widget.TabPageIndicator" parent="Widget">
        <item name="android:gravity">center</item>
        <item name="android:background">@drawable/vpi__tab_indicator</item><!-- 背景设置 -->
        <item name="android:paddingLeft">22dip</item>
        <item name="android:paddingRight">22dip</item>
        <item name="android:paddingTop">12dp</item>
        <item name="android:paddingBottom">12dp</item>
        <item name="android:textAppearance">@style/TextAppearance.TabPageIndicator</item>
        <item name="android:textSize">22sp</item>
        <item name="android:textColor">@drawable/vpi__tab_text_color_indicator</item><!-- 文字背景-->
        <item name="android:maxLines">1</item>
    </style>

 3.ViewPagerIndicator的滑动事件(默认被SlideMenu拦截 )

  ①. 当TabPageIndicator 向左时会被SlideMenu拦截事件 (如果设置SlideMenu的设置不拦截和不处理touch事件的话很复杂)
解决方法:①TabPageIndicator 请求不要拦截 

<span style="white-space:pre">			</span>/**
			 * 事件分发, 请求父控件及祖宗控件不要拦截事件
		 	*/
			@Override
			public boolean dispatchTouchEvent(MotionEvent ev) {
				getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求
				return super.dispatchTouchEvent(ev);
			}
②.当ViewPager向左滑动时也会被SlideMenu拦截事件
解决方法:②ViewPager 请求不要拦截 自定义VIewpager

/*
	 *请求上面的viewpager不要拦截这个滑动事件
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// 当为第一页的时候拦截,其他页不拦截(其他页不管,这样的话就可以解决冲突)
		if(getCurrentItem()!=0)
		getParent().requestDisallowInterceptTouchEvent(true);
//		else 
//		getParent().requestDisallowInterceptTouchEvent(false);
		return super.dispatchTouchEvent(ev);
	}

4.位置指示器的使用


①.布局文件

xmlns:app="http://schemas.android.com/apk/res-auto"
<com.viewpagerindicator.CirclePageIndicator
            android:id="@+id/indicator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:padding="10dip"
            app:fillColor="#f00"
            app:pageColor="@android:color/darker_gray"
            app:radius="3dp"
            app:strokeWidth="0dp" />
②.代码设置

	mViewPager.setAdapter(new TopNewsAdapter());
	// 因为这个和viewpager一起在用,所以让这个设置监听,不然不会改变
	indicator.setOnPageChangeListener(this);
	indicator.setViewPager(mViewPager);
	indicator.setSnap(true);// 支持快照显示
	indicator.onPageSelected(0);//默认设置为第一个点

5.拦截事件

大VIewpager + SlideMenu

中间VIewpager

里面VIewpager

①..大的VIewpager设置不拦截.同时设置不处理touch事件里面的VIewpager就可以滑动

解决方法:

<span style="white-space:pre">	</span>public boolean onInterceptTouchEvent(MotionEvent arg0) {
			// TODO Auto-generated method stub
			return false;
		}

		// 表示viewPager什么都不做
		@Override
		public boolean onTouchEvent(MotionEvent ev) {
			return false;
		}
        ②.中间VIewPager 和 SlideMenu 冲突 

解决方法:

/*
	 *请求上面的viewpager不要拦截这个滑动事件
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// 当为第一页的时候拦截,其他页不拦截(其他页不管,这样的话就可以解决冲突)
		if(getCurrentItem()!=0)
		getParent().requestDisallowInterceptTouchEvent(true);
//		else 
//		getParent().requestDisallowInterceptTouchEvent(false);
		return super.dispatchTouchEvent(ev);
	}
③.里面VIewpager 和中间VIewPager SlideMenu冲突

解决方法:

/*
	 * 请求上面的viewpager不要拦截这个滑动事件
	 * 
	 * 1.如果是左滑到最后一张图片需要父控件拦截 
	 * 2.如果是右滑到第一种图片需要父控件拦截 
	 * 3.如果是上下滑动需要父控件拦截
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			startX = ev.getX();
			startY = ev.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			endX = ev.getX();
			endY = ev.getY();

			if (Math.abs(endX - startX) - Math.abs(endY - startY) > 0) {// 左右滑动
				if (endX - startX > 0) {// 向右滑动
					if (getCurrentItem() == 0) {// 是第一张图片
						getParent().requestDisallowInterceptTouchEvent(false);// 拦截
					}else{
						getParent().requestDisallowInterceptTouchEvent(true);// 不拦截
					}
				} else {// 向左滑动
					if (getCurrentItem() == (getAdapter().getCount() - 1)) {// 最后一张图片
						getParent().requestDisallowInterceptTouchEvent(false);// 拦截
					}else{
						getParent().requestDisallowInterceptTouchEvent(true);// 不拦截
					}
				}
			} else {// 上下滑动拦截
				getParent().requestDisallowInterceptTouchEvent(false);
			}

			break;
		case MotionEvent.ACTION_UP:

			break;

		default:
			break;
		}
		
		return super.dispatchTouchEvent(ev);

6.LIstVIew添加headVIew 和 数据设置

//11个页签详情页

public class TabDetailPager extends BaseMenuDetailPager implements
		OnPageChangeListener {
	@ViewInject(R.id.vp_news)
	private ViewPager mViewPager;
	@ViewInject(R.id.tv_title)
	private TextView tvTitle;// 头条新闻的标题
	@ViewInject(R.id.indicator)
	private CirclePageIndicator indicator;// 新闻头条指示器....点
	@ViewInject(R.id.lv_list)
	private ListView listView;
	
	private TabData tabdata;
	private NewsTabData mNewsTabData;
	private String murl;
	
	private ArrayList<TopNewsData> topnews;// 新闻头条集合
	private ArrayList<TabNewsData> news;
	private myNewsAdapter myNewsAdapter;
	private View headview;

	public TabDetailPager(Activity activity, NewsTabData newsTabData) {
		super(activity);
		mNewsTabData = newsTabData;
	}

	// 填充的布局
	@Override
	public View initView() {
		View view = View.inflate(mActivity, R.layout.tab_detail_pager, null);
		headview = View.inflate(mActivity, R.layout.list_header_topnews, null);
		
		ViewUtils.inject(this, view);
		ViewUtils.inject(this, headview);
		listView.addHeaderView(headview);
		
		return view;
	}

	@Override
	public void initData() {
		super.initData();
		murl = GlobalContants.SERVER_URL + mNewsTabData.url;
		getDataFromServer(murl);

	}

	class TopNewsAdapter extends PagerAdapter {

		private BitmapUtils bitmapUtils;

		TopNewsAdapter() {
			bitmapUtils = new BitmapUtils(mActivity);
		}

		@Override
		public int getCount() {
			return topnews.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			ImageView imageView = new ImageView(mActivity);
			imageView.setScaleType(ScaleType.FIT_XY);
			// imageView.setBackgroundResource(R.drawable.topnews_item_default);
			TopNewsData topNewsData = topnews.get(position);

			// bitmapUtils加载图片到iamgeVIew中
			bitmapUtils
					.display(imageView, topNewsData.topimage.replace(
							"10.0.2.2", GlobalContants.IP));
			container.addView(imageView);
			return imageView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}
	}

	private void getDataFromServer(String url) {
		HttpUtils httpUtils = new HttpUtils();
		httpUtils.send(HttpMethod.GET, url, new RequestCallBack<String>() {

			@Override
			public void onSuccess(ResponseInfo<String> responseInfo) {
				String result = (String) responseInfo.result;
				System.out.println("返回数据" + result);
				parseData(result);
			}

			@Override
			public void onFailure(HttpException error, String msg) {
				Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show();
				error.printStackTrace();
			}
		});
	}

	// 解析数据
	protected void parseData(String result) {
		Gson gson = new Gson();
		tabdata = gson.fromJson(result, TabData.class);

		topnews = tabdata.data.topnews;
		news = tabdata.data.news;
		if (topnews != null) {
			// System.out.println(tabdata);
			// 在这之后才调用 否则空指针,因为请求数据和解析都是子线程中

			mViewPager.setAdapter(new TopNewsAdapter());
			// 因为这个和viewpager一起在用,所以让这个设置监听,不然不会改变
			indicator.setOnPageChangeListener(this);

			indicator.setViewPager(mViewPager);
			indicator.setSnap(true);// 支持快照显示
			indicator.onPageSelected(0);//默认设置为第一个点
			tvTitle.setText(topnews.get(0).title);// 默认设置第一页的标题
		}
		if (news != null) {
			myNewsAdapter = new myNewsAdapter();
			listView.setAdapter(myNewsAdapter);
			//listView.addHeaderView(headview);
		}

	}

	class myNewsAdapter extends BaseAdapter {
		private BitmapUtils utils;

		public myNewsAdapter() {
			utils = new BitmapUtils(mActivity);
			utils.configDefaultLoadingImage(R.drawable.pic_item_list_default);
		}
		@Override
		public int getCount() {
			return news.size();
		}

		@Override
		public Object getItem(int position) {
			return news.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if (convertView == null) {
				convertView = View.inflate(mActivity, R.layout.list_news_item,
						null);
				holder = new ViewHolder();
				holder.ivPic = (ImageView) convertView.findViewById(R.id.iv_pic);
				holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
				holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			TabNewsData tabNewsData = news.get(position);
			holder.tvTitle.setText(tabNewsData.title);
			utils.display(holder.ivPic, tabNewsData.listimage.replace
					("10.0.2.2", GlobalContants.IP));
			holder.tvDate.setText(tabNewsData.pubdate);
			return convertView;
		}
	}

	static class ViewHolder {
		public TextView tvTitle;
		public TextView tvDate;
		public ImageView ivPic;
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {

	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {

	}

	@Override
	public void onPageSelected(int arg0) {
		tvTitle.setText(topnews.get(arg0).title);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值