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);
}
}