一、JSON格式
{“name”:"zhangsan","age":18,"books":[
{"name":"金瓶梅",“price”:10},
{"name":"红雷梦",“price”:20}
]}
浏览器json数据乱码问题->火狐浏览器中切换一下编码方式
二、网络访问Json解析(Gson使用+配合xutils)--》针对eclipse
1、在Tomcat 8.0\webapps\ROOT目录下加入接口文件
2、创建全局资源
新建global包-》GlobalContants类
publicclassGlobalContants { publicstaticfinalString SERVER_URL="http://10.0.2.2:8080/zhbj"; publicstaticfinalString CATEGORIES_URL=SERVER_URL+"/categories.json"; }
|
|
电脑访问本机-》localhost、或者(127.。。)
模拟器访问电脑-》10.0.2.2
3、从服务器获取json数据(string)
使用了引用的lib资源xutils
onsuccess和failure都是在主线程中调用
privatevoidgetDataFromServer() { // TODO Auto-generated method stub HttpUtils httpUtils=newHttpUtils(); httpUtils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL, newRequestCallBack<String>() { @Override publicvoidonSuccess(ResponseInfo responseInfo) { // TODO Auto-generated method stub String result=(String)responseInfo.result; System.out.println("返回结果"+result); // String result=""; parseData(result); } @Override publicvoidonFailure(HttpException error, String msg) { // TODO Auto-generated method stub Toast.makeText(mActivity,msg, Toast.LENGTH_LONG).show(); error.printStackTrace(); //打印异常 } }); }
|
|
1 | String result=(String)responseInfo.result; |
这里会出现错误-》解决方法:
将路径sdk\platforms\android-23\optional下的org.apache.http.legacy.jar复制到Libs目录下.
4、将获取的string格式的json数据解析成对象(GSON使用)
- 在libs目录下导入gson包
http://pan.baidu.com/s/1dFdPVWX
- 将获取的string类型的json数据传入
protectedvoidparseData(String result) { // TODO Auto-generated method stub Gson gson=newGson(); NewsData data=gson.fromJson(result,NewsData.class); }
|
|
-根据json数据写一个接受它的对象.注意在写的时候类中的类型名一定要和Json数据中给的想要接受的数据名称一致。遇到数组就创建arraylist,遇到数据就直接写。tips:source可以自动继承tostring方法.!
publicclassNewsData { publicintretcode; publicArrayList<NewMenuData> data; //侧边栏数据对象 publicclassNewMenuData{ publicString id; publicString title; publicinttype; publicString url; publicArrayList<NewsTabData> children; @Override publicString toString() { return"NewMenuData [title="+ title +", children="+ children +"]"; } } //新闻页面下11个子页签 publicclassNewsTabData{ publicString id; publicString title; publicinttype; publicString url; @Override publicString toString() { return"NewsTabData [title="+ title +"]"; } } @Override publicString toString() { return"NewsData [retcode="+ retcode +", data="+ data +"]"; } }
三、数据传递(将数据传递给侧边栏)
将contentfragment一个页签下获取的数据传到leftMenufragment页面下。
-通过得到共同的activty
-在activity中定义获取侧边栏Leftmenu的方法
-定义leftmenufragment中set数据方法
-在获得数据页面通过调用leftmenufragment中get方法将数据传递
contentfragment下一个页签NewsCenterPager.java
//解析网络数据并将其传递给LeftMenu protected void parseData(String result) { // TODO Auto-generated method stub Gson gson=new Gson(); NewsData data=gson.fromJson(result,NewsData.class); MainActivity mainUi=(MainActivity)mActivity; LeftMenuFragment leftMenuFragment=mainUi.getLeftMenuFragment(); leftMenuFragment.setMenuData(data); } MainActivity中定义得到侧边栏的方法 public LeftMenuFragment getLeftMenuFragment(){ FragmentManager fManager=getSupportFragmentManager(); LeftMenuFragment leftMenuFragment=(LeftMenuFragment) fManager.findFragmentByTag(FRAGMENT_LEFT_MENU); return leftMenuFragment; }
leftmenufragment.java中定义设置数据
//设置网络数据 public void setMenuData(NewsData data){ mNewMenuDatas=data.data; lvList.setAdapter(new menuAdapter());
这里总结一下列表和适配器的使用
-一个List,一个重写的adpter
定义 private ListView lvList; ArrayList<NewMenuData> mNewMenuDatas; 设置适配器 lvList.setAdapter(new menuAdapter()); 重写适配器 class menuAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return mNewMenuDatas.size(); } @Override public NewMenuData getItem(int position) { // TODO Auto-generated method stub return mNewMenuDatas.get(position); //获得arraylist某个指定下标的对象 } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view=View.inflate(myactivity,R.layout.list_menu_item,null); TextView tvTitle=(TextView) view.findViewById(R.id.tv_title); NewMenuData newMenuData=getItem(position); tvTitle.setText(newMenuData.title); return view; } }
R.layout.list_menu_item文件定义了每个行的样式
Tips:
android:drawableLeft="@drawable/btn_menu_selector"
android:drawablePadding="5dp"
原来这个代码可以给textiew加入图片
<?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:orientation="vertical" android:padding="10dp" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:drawableLeft="@drawable/btn_menu_selector" android:drawablePadding="5dp" android:enabled="false" android:text="新闻" android:textColor="@drawable/text_menu_selector" android:textSize="25sp" /> </LinearLayout>
-切换侧边栏的状态
SlidingMenu slidingMenu=mainUi.getSlidingMenu(); slidingMenu.toggle();
-fragment里面再内嵌fragment会出现滑动异常
-》在新闻中心页面点击左侧边栏会实现页面切换,切换进来的页面本身又是一个fragment。重写了外部的fragment会对里面的fragment影响
-》解决方法:设置事件拦截
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 } //表示事件是否拦截,false表示不拦截 @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub return false; } @Override public boolean onTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub return false; } }
引用别人框架时候如何搜索需要的
引入lib和项目不在同一个文件下?
SHA-1
setviewpager在setadapter之后
四、ViewpagerIndicator使用
1.
实现切换页面下的小页签实现页面跳转:开源框架ViewpagerIndicator+viewpager的使用
以前太傻了,不会使用别人造好的轮子。
网盘链接:http://pan.baidu.com/s/1jI93Xzw
-将library包add进需要的项目中
-布局复制(在导入的demo 演示中找到需要的样式-》copy)
tips:根据字段在全局中搜索代码相应位置,search->file->containtext
<?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:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/vp_menu" android:layout_width="wrap_content" android:layout_height="match_parent" /> <com.viewpagerindicator.TabPageIndicator //这个控件就是那一排用来切换的小页签 android:id="@+id/indicator" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout>
-java中给TabPageIndicator setViewPager(必须在viewpager setadapter之后)
@Override public void initData() { // TODO Auto-generated method stub mTabDetailPagers=new ArrayList<TabDetailPager>(); //初始化页签数据 for(int i=0;i<mNewsTabDatas.size();i++){ TabDetailPager mTabDetailPager=new TabDetailPager(mActivity,mNewsTabDatas.get(i)); mTabDetailPagers.add(mTabDetailPager); } mviewPager.setAdapter(new MenuDetailAdapter()); indicator.setViewPager(mviewPager);//必须在setadpater之后调用 }
-返回页面标题,用于viewpagerindicate页签显示
重写适配器
class MenuDetailAdapter extends PagerAdapter{ @Override public CharSequence getPageTitle(int position) { // TODO Auto-generated method stub return mNewsTabDatas.get(position).title; }
2.在11个子页签indicator或者viewpager滑动的时候不要划出侧边栏
(1)阻止滑动TabPageIndicator时侧边栏划出
-改写所引用的Library中相应代码内容(是的,可以这么做。可以直接修改导入的引用)
public class TabPageIndicator extends HorizontalScrollView implements PageIndicator { /** * 事件分发,请求父控件及祖宗控件不要拦截事件 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub getParent().requestDisallowInterceptTouchEvent(true); //这里要让父容器去请求不要拦截 return super.dispatchTouchEvent(ev); } }
(2)阻止滑动子页面下的viewpager时侧边栏划出
就像这样,让子页面自己的viewpager自己那么自然的滑动切换
不要拦截自己的滑动事件、顶部和viewpager
-重写viewpager类
/** * * 11个页签滑动viewpager * @author y x * */ public class HorizontalViewPager extends ViewPager { public HorizontalViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } /** * 事件分发,请求父控件及祖宗控件不要拦截事件 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); } }
-更改相应xml布局中需要的viewpager控件
3.实现11个子页面下的大广告和列表界面
(1)打广告
哈哈。其实打广告就是Viewpager啦。布局文件略。。
-重写继承与viewpager的类
这里重写还是和之前一样的原因,在它自己滑动的时候会受包裹它的viewpager的影响。重写的内容也一模一样。
(2)解析页签对应url中的数据
(这是一个复杂的过程)
http://localhost:8080/zhbj/categories.json显示的JSON数据,我需要跳转到数组元素url对应的地址中去:
http://localhost:8080/zhbj/10007/list_1.json
-页签详情页的类的构造方法里传递相应页签标记(页签数组中对应元素)
-生成页签详情页数据的url
-在Initdata方法里面从服务器获取数据并解析
-谈到GSON解析自然要写一个对应的接受类
/** * 页签详情页 * * @author y x * */ public class TabDetailPager extends BaseMenuDetailPager { private NewsTabData mNewsTabData; //对应页签标记内容 private TextView textView; private String mUrl; //需要跳转到url private TabData tabData; //GSON解析的类对象 @ViewInject(R.id.vp_news) private ViewPager mvViewPager; public TabDetailPager(Activity mActivity, NewsTabData newsTabData) { super(mActivity); // TODO Auto-generated constructor stub mNewsTabData=newsTabData; mUrl=GlobalContants.SERVER_URL+mNewsTabData.url; //取得对应url } @Override public View initViews() { // TODO Auto-generated method stub View view =View.inflate(mActivity, R.layout.tab_detail_pager,null); ViewUtils.inject(this,view); return view; } @Override public void initData() { // TODO Auto-generated method stub getDatafromServer(); } private void getDatafromServer() { // TODO Auto-generated method stub HttpUtils utils=new HttpUtils(); utils.send(HttpMethod.GET, mUrl,new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { // TODO Auto-generated method stub String result=(String)responseInfo.result; // System.out.println("返回结果"+result); parseData(result); } @Override public void onFailure(HttpException error, String msg) { // TODO Auto-generated method stub Toast.makeText(mActivity,msg, Toast.LENGTH_LONG).show(); error.printStackTrace(); //打印异常 } }); } protected void parseData(String result) { // TODO Auto-generated method stub Gson gson=new Gson(); tabData=gson.fromJson(result,TabData.class); System.out.println("页签详情页"+tabData.toString());
mvViewPager.setAdapter(new TopNewsAdapter());
}
class TopNewsAdapter extends PagerAdapter{ private BitmapUtils bitmapUtils; public TopNewsAdapter() { // TODO Auto-generated constructor stub bitmapUtils=new BitmapUtils(mActivity); bitmapUtils.configDefaultLoadingImage(R.drawable.img_menu); //设置默认加载的图片 } @Override public int getCount() { // TODO Auto-generated method stub return tabData.data.topnews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } @Override public Object instantiateItem(View container, int position) { ImageView iv_topnews=new ImageView(mActivity); iv_topnews.setScaleType(ScaleType.FIT_XY); //填充完整父控件 Topnews_Data topnewsdata=tabData.data.topnews.get(position); bitmapUtils.display(iv_topnews,topnewsdata.topimage); //给iv_topnews图片加载topnewsdata.topimage地址对应图片 ((ViewGroup) container).addView(iv_topnews); return iv_topnews; } @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub ((ViewPager) container).removeView((View) object); } } }