研究了好久的上述三个框架,一开始都是在看文档,看api,看博客,但是收效甚微。“实践才是检验真理的唯一标注”,动手写下才发现,更容易理解
这里是第一个版本的实现方法,以后会后续更新:
- 首先是进行依赖:
compile 'com.android.support:appcompat-v7:24.1.1' compile 'com.android.support:support-v4:24.1.1' compile 'com.android.support:recyclerview-v7:24.1.1' compile 'com.android.support:cardview-v7:24.1.1' compile 'com.android.support:design:24.1.1' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.retrofit2:retrofit:2.0.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' compile 'io.reactivex:rxjava:1.0.10' compile 'com.github.bumptech.glide:glide:3.6.0'
- 项目结构如下:
- 其中测试的api包下的mainapi 的interface如下
/** * Created by Ly on 2016/8/10. */ public interface mainFragmentApi { @GET("xxxxxAction!getHotContent.htm") Observable<L_MainContentBean> search(@Query("infoType") String infoType); @GET("xxxxxxx!getInformationType.htm") Observable<L_MainTitleBean> getMainTitle(); }
- 封装的NetWord工具类代码如下
package com.Lht.RxAndroidSample.business.network; import com.Lht.RxAndroidSample.business.network.api.mainFragmentApi; import okhttp3.OkHttpClient; import retrofit2.CallAdapter; import retrofit2.Converter; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by Ly on 2016/8/10. */ public class Network { private static final String BASE_URL = "http://app.xxxxxxxx.com.cn"; private static final String BASE_PIC = "http://web.xxxxxxx.com.cn/"; // 主页的fragment private static mainFragmentApi mMainContentApi; /** * 初始化必须的工具类 */ private static OkHttpClient okHttpClient = new OkHttpClient(); private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create(); public static String getBasePic() { return BASE_PIC; } /** * 获取首页内容 * * @return */ public static mainFragmentApi dogetMainFragmentApi() { if (mMainContentApi == null) { Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(BASE_URL) .addConverterFactory(gsonConverterFactory) .addCallAdapterFactory(rxJavaCallAdapterFactory) .build(); mMainContentApi = retrofit.create(mainFragmentApi.class); } return mMainContentApi; } }
- 看到这里是不是懵逼了?我也是,实操才是学习的最好办法,调用方法如下
package com.Lht.RxAndroidSample.business.fragment.main; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.Lht.RxAndroidSample.R; import com.Lht.RxAndroidSample.business.base.baseFragment; import com.Lht.RxAndroidSample.business.fragment.main.detailfragment.L_MainChildFragment; import com.Lht.RxAndroidSample.business.network.Network; import com.Lht.RxAndroidSample.module.bean.L_MainTitleBean; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by Ly on 2016/8/9. */ public class MainFragment extends baseFragment { @Bind(android.R.id.tabs) TabLayout tbMainPagerTabLayout; @Bind(R.id.viewPager) ViewPager vpMainPagerViewPager; private mainAdapter mMainAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.l_fragment_mainpager, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); tbMainPagerTabLayout.setupWithViewPager(vpMainPagerViewPager); tbMainPagerTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { if (mMainAdapter.getCount() > 0 && mMainAdapter.getCount() > tab.getPosition()) { ((L_MainChildFragment) mMainAdapter.getItem(tab.getPosition())).doLoadData(mMainAdapter.getTypeid(tab.getPosition())); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); subscription = Network .dogetMainFragmentApi() .getMainTitle() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mainTitleBeanObservable); } /** * 获取头部信息的观察者 */ Observer<L_MainTitleBean> mainTitleBeanObservable = new Observer<L_MainTitleBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(L_MainTitleBean lMainTitleBean) { Log.e("LHT", lMainTitleBean.toString()); if (lMainTitleBean.getCode() == 0) { mMainAdapter = new mainAdapter(getChildFragmentManager(), lMainTitleBean.getInfoTypeVoList()); vpMainPagerViewPager.setAdapter(mMainAdapter); vpMainPagerViewPager.setOffscreenPageLimit(lMainTitleBean.getInfoTypeVoList().size() - 1); } else { Toast.makeText(getActivity(), "加载失败", Toast.LENGTH_SHORT).show(); } } }; /** * 首页的适配器 */ private class mainAdapter extends FragmentPagerAdapter { private List<L_MainTitleBean.InfoTypeVoListBean> listBeen = new ArrayList<>(); private List<Fragment> fragmentList = new ArrayList<>(); public mainAdapter(FragmentManager fm, List<L_MainTitleBean.InfoTypeVoListBean> listBeen) { super(fm); this.listBeen = listBeen; for (int i = 0; i < this.listBeen.size(); i++) { fragmentList.add(new L_MainChildFragment()); } } @Override public Fragment getItem(int position) { return fragmentList.get(position); } public String getTypeid(int postion) { return listBeen.get(postion).getTypeId(); } @Override public int getCount() { return fragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return listBeen.get(position).getName(); } } }
- 我知道还是很懵逼,但是这个急不来,慢慢看,毕竟是多个工具类一起嵌套apk下载地址