不能滚动的ViewPager
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return true;
}
}
从服务器获取数据
/**
* 从服务器获取数据
*/
private void getDataFromServer(){
HttpUtils utils=new HttpUtils();
utils.send(HttpMethod.GET, Constants.CATEGORIES_URL, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
// TODO Auto-generated method stub
String result=responseInfo.result;
processResult(result);
}
@Override
public void onFailure(HttpException error, String msg) {
}
});
}
Gson解析
导入jar包
创建实体类
/**
* 新闻中心分类数据
* gson对象封装原则
* 遇到{}就是一个对象
* 遇到[]就是一个ArrayList
* 对象中所有属性名必须和服务器返回字段完全一致
* @author Administrator
*
*/
public class NewMenuData {
public int retcode;
public ArrayList<String> extend;
public class NewsData{
public String id;
public String title;
public int type;
public ArrayList<NewsTabData> children;
}
//页签信息封装
public class NewsTabData{
public String id;
public String title;
public String url;
public int type;
}
}
/**
* 解析json数据
*/
protected void processResult(String result) {
Gson gson=new Gson();
NewMenuData fromJson = gson.fromJson(result, NewMenuData.class);
}
左侧menu菜单
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
android:orientation="vertical" >
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
/>
</LinearLayout>
list_item_left_menu
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:drawableLeft="@drawable/btn_arrow_selector"
android:drawablePadding="3dp"
android:textColor="@color/text_arrow_selector"
android:textSize="20sp"
android:padding="15dp"
/>
</LinearLayout>
public class LeftMenuFragement extends BaseFragement {
@ViewInject(R.id.lv_list)
private ListView lvList;
private ArrayList<NewsData> mMenuList;
private int mCurrentPos;
private MenuAdapter menuAdapter;
@Override
public View initView() {
View view=View.inflate(mActivity, R.layout.fragement_left_menu ,null);
ViewUtils.inject(this,view);
return view;
}
public void setData(ArrayList<NewsData> data){
mMenuList=data;
menuAdapter = new MenuAdapter();
lvList.setAdapter(menuAdapter);
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
mCurrentPos=arg2;
menuAdapter.notifyDataSetChanged();
}
});
}
class MenuAdapter extends BaseAdapter{
@Override
public int getCount() {
return mMenuList.size();
}
@Override
public NewsData getItem(int position) {
return mMenuList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(mActivity, R.layout.list_item_left_menu ,null);
TextView tvMenu=(TextView) view.findViewById(R.id.tv_menu);
NewsData data = getItem(position);
tvMenu.setText(data.title);
if(mCurrentPos==position){
tvMenu.setEnabled(true);
}else
tvMenu.setEnabled(false);
return view;
}
}
}
NewCenterPager类修改
/**
* 从服务器获取数据
*/
private void getDataFromServer(){
HttpUtils utils=new HttpUtils();
utils.send(HttpMethod.GET, Constants.CATEGORIES_URL, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result=responseInfo.result;
processResult(result);
}
@Override
public void onFailure(
com.lidroid.xutils.exception.HttpException error, String msg) {
System.out.println(msg);
}
});
}
/**
* 解析json数据
*/
protected void processResult(String result) {
Gson gson=new Gson();
NewMenuData newsMenuData = gson.fromJson(result, NewMenuData.class);
MainActivity mainUI=(MainActivity)mActivity;
LeftMenuFragement leftMenuFragment = mainUI.getLeftMenuFragment();
leftMenuFragment.setData(newsMenuData.data);
}
MainActivity类添加方法
/**
* 获取侧边栏对象
*/
public LeftMenuFragement getLeftMenuFragment(){
FragmentManager fm=getSupportFragmentManager();
LeftMenuFragement fragment=(LeftMenuFragement) fm.findFragmentByTag(TAG_LEFT_MENU);
return fragment;
}
效果
侧边栏详情页
/**
* 侧边栏详情页基类
* @author liangjun
*
*/
public abstract class BaseMenuDetailPager {
public Activity mActivity;
public View mRootView;
public BaseMenuDetailPager(Activity activity){
mActivity=activity;
mRootView=initView();
}
public abstract View initView() ;
public void initData(){
}
}
public class NewsMenuDetailPager extends BaseMenuDetailPager{
public NewsMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initView() {
TextView view=new TextView(mActivity);
view.setText("菜单详情-新闻");
view.setTextColor(Color.RED);
view.setTextSize(22);
view.setGravity(Gravity.CENTER);
return view;
}
}
LeftMenuFragement类方法添加
public void setData(ArrayList<NewsData> data){
mMenuList=data;
menuAdapter = new MenuAdapter();
lvList.setAdapter(menuAdapter);
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
mCurrentPos=arg2;
menuAdapter.notifyDataSetChanged();
setCurrentMenuDetailPager(arg2);
}
});
}
private void setCurrentMenuDetailPager(int arg2) {
MainActivity mainUI=(MainActivity)mActivity;
ContentMenuFragement contentMenuFragement = mainUI.getContentMenuFragement();
NewCenterPager newCenter=contentMenuFragement.getNewsMenuDetail();
newCenter.setCurrentMenuDetailPager(arg2);
}
ContentMenuFragement类添加方法
protected NewCenterPager getNewsMenuDetail(){
NewCenterPager newCenter=(NewCenterPager)mPagers.get(1);
return newCenter;
}
NewCenterPager类修改添加
private ArrayList<BaseMenuDetailPager> menuDetails;
@Override
public void initData() {
tvTitle.setText("新闻中心");
TextView view=new TextView(mActivity);
view.setText("新闻中心");
view.setTextColor(Color.RED);
view.setTextSize(22);
view.setGravity(Gravity.CENTER);
flContent.addView(view);
getDataFromServer();
menuDetails=new ArrayList<BaseMenuDetailPager>();
menuDetails.add(new NewsMenuDetailPager(mActivity));
menuDetails.add(new TopicMenuDetailPager(mActivity));
menuDetails.add(new PhotosMenuDetailPager(mActivity));
menuDetails.add(new InteractMenuDetailPager(mActivity));
}
protected void setCurrentMenuDetailPager(int position) {
BaseMenuDetailPager view=menuDetails.get(position);
flContent.removeAllViews();
flContent.addView(view.initView());
}
效果
页签页面
NewsMenuDetailPager 类
public class NewsMenuDetailPager extends BaseMenuDetailPager{
@ViewInject(R.id.vp_news_detail)
private ViewPager mViewPager;
ArrayList<NewsTabData> mTabList;
ArrayList<TabDetailPager> mTabPager;
public NewsMenuDetailPager(Activity activity,ArrayList<NewsTabData> children) {
super(activity);
mTabList=children;
}
@Override
public View initView() {
View view=View.inflate(mActivity, R.layout.pager_menu_detail_news, null);
ViewUtils.inject(this,view);
return view;
}
@Override
public void initData() {
mTabPager=new ArrayList<TabDetailPager>();
for (NewsTabData tableData:mTabList) {
TabDetailPager pager=new TabDetailPager(mActivity,tableData);
mTabPager.add(pager);
}
mViewPager.setAdapter(new NewsMenuAdapter());
}
class NewsMenuAdapter extends PagerAdapter{
@Override
public int getCount() {
return mTabPager.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
TabDetailPager pager=mTabPager.get(position);
container.addView(pager.mRootView);
pager.initData();
return pager.mRootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}
}
TabDetailPager 类
/**
* 12个页签的页面对象
* @author Administrator
*
*/
public class TabDetailPager extends BaseMenuDetailPager {
private NewsTabData mTableData;
private TextView mTextView;
public TabDetailPager(Activity activity,NewsTabData tabData) {
super(activity);
mTableData=tabData;
}
@Override
public View initView() {
mTextView=new TextView(mActivity);
mTextView.setText("页签");
mTextView.setTextColor(Color.RED);
mTextView.setTextSize(22);
mTextView.setGravity(Gravity.CENTER);
return mTextView;
}
@Override
public void initData() {
mTextView.setText(mTableData.title);
}
}
效果
Viewpager冲突
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context) {
super(context);
}
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//决定事件是否中断
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return false;//不拦截事件,让嵌套的子viewpager有机会响应触摸事件
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return true;
}
}
Viewpager和SlidingMenu冲突
public class NewsMenuDetailPager extends BaseMenuDetailPager implements OnPageChangeListener{
@ViewInject(R.id.vp_news_detail)
private ViewPager mViewPager;
ArrayList<NewsTabData> mTabList;
ArrayList<TabDetailPager> mTabPager;
public NewsMenuDetailPager(Activity activity,ArrayList<NewsTabData> children) {
super(activity);
mTabList=children;
}
@Override
public View initView() {
View view=View.inflate(mActivity, R.layout.pager_menu_detail_news, null);
ViewUtils.inject(this,view);
return view;
}
@Override
public void initData() {
mTabPager=new ArrayList<TabDetailPager>();
for (NewsTabData tableData:mTabList) {
TabDetailPager pager=new TabDetailPager(mActivity,tableData);
mTabPager.add(pager);
}
mViewPager.setAdapter(new NewsMenuAdapter());
mViewPager.setOnPageChangeListener(this);
}
class NewsMenuAdapter extends PagerAdapter{
@Override
public int getCount() {
return mTabPager.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
TabDetailPager pager=mTabPager.get(position);
container.addView(pager.mRootView);
pager.initData();
return pager.mRootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}
/**
* 设置侧边栏可用不可用
* @param enable
*/
private void setSlidingMenuEnable(boolean enable){
MainActivity mainUI=(MainActivity)mActivity;
SlidingMenu slidingMenu = mainUI.getSlidingMenu();
if(enable){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else
//禁用掉侧边栏
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
if(arg0==0){
//开启侧边栏
setSlidingMenuEnable(true);
}else
setSlidingMenuEnable(false);
//关闭侧边栏
}
}
ViewPagerIndicator框架
问题
android-support-v4.jar
SHA-1: 48c94ae70fa65718b382098237806a5909bb096e
不一致
用SlidingMenuLibrary覆盖了ViewPagerIndicator
步骤
1.
2.
3
4添加样式
5当viewpage和指针绑定时,需要将页面切换监听设置给指针
和SlidingMenu冲突
TabPageIndicator类
//dispatchTouchEvent->interceptTouchEvent->onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//请求父控件及祖宗控件不要拦截当前控件的事件
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
跳到下一个页签
pager_menu_detail_news.xml修改
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<ImageView
android:id="@+id/iv_next_page"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/news_cate_arr"
android:layout_gravity="center"
android:padding="10dp"
/>
</LinearLayout>
NewsMenuDetailPager类
@OnClick(R.id.iv_next_page)
public void nextPage(View view){
int currentItem=mViewPager.getCurrentItem();
currentItem++;
mViewPager.setCurrentItem(currentItem);
}