android

一、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";
 
}




url路径问题:

电脑访问本机-》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);
     
}


  可以解析出一个NewData.class的对象

  -根据json数据写一个接受它的对象.注意在写的时候类中的类型名一定要和Json数据中给的想要接受的数据名称一致。遇到数组就创建arraylist,遇到数据就直接写。tips:source可以自动继承tostring方法.!

android_第1张图片



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




android_第2张图片

   -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.

android_第3张图片


实现切换页面下的小页签实现页面跳转:开源框架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时侧边栏划出

android_第4张图片


  -改写所引用的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);
    }
    
}



虽然自己对touchevent的理解不深,但我觉得这个方法就是滑动之后不要让父控件不要阻止 TabPageIndicator滑动时产生的效果,就是不要划出侧边栏。

(2)阻止滑动子页面下的viewpager时侧边栏划出

android_第5张图片

 就像这样,让子页面自己的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个子页面下的大广告和列表界面

android_第6张图片

(1)打广告

 哈哈。其实打广告就是Viewpager啦。布局文件略。。

-重写继承与viewpager的类

这里重写还是和之前一样的原因,在它自己滑动的时候会受包裹它的viewpager的影响。重写的内容也一模一样。


(2)解析页签对应url中的数据

(这是一个复杂的过程)

http://localhost:8080/zhbj/categories.json显示的JSON数据,我需要跳转到数组元素url对应的地址中去:

http://localhost:8080/zhbj/10007/list_1.json

android_第7张图片

-页签详情页的类的构造方法里传递相应页签标记(页签数组中对应元素)

-生成页签详情页数据的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);
		}
	}
}



你可能感兴趣的:(android)