使用BottomTabBar实现底部导航,MVP网络框架,retrofit解析
2017-11-05 20:39
911 查看
加依赖
主页面
Fragment_04
ZixunFragment
MyAdapter
主页面的布局
fragment_04
fragment_zixun
item
compile 'com.hjm:BottomTabBar:1.1.1' compile 'com.android.support:design:26.0.0-alpha1' compile 'com.android.support:recyclerview-v7:26.+' compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.github.bumptech.glide:glide:3.7.0'
主页面
public class MainActivity extends AppCompatActivity { private BottomTabBar mb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mb =(BottomTabBar)findViewById(R.id.bottom_tab_bar); mb.init(getSupportFragmentManager()) .setImgSize(50,50) .setFontSize(14) .setTabPadding(4,6,10) .setChangeColor(Color.RED,Color.DKGRAY) .addTabItem("首页",R.drawable.a_w, Fragment01.class) .addTabItem("自选",R.drawable.a8u, Fragment02.class) .addTabItem("行情",R.drawable.a9p, Fragment03.class) .a 4000 ddTabItem("资讯",R.drawable.a9v, Fragment04.class) .isShowDivider(false) .setOnTabChangeListener(new BottomTabBar.OnTabChangeListener() { @Override public void onTabChange(int position, String name) { } }); } }
Fragment_04
public class Fragment04 extends Fragment { private View view; private TabLayout tab; private String[] name=new String[]{"数据新闻","快讯","头条","精编公告","美股","港股","基金","理财"}; private List<Fragment> list; private ViewPager viewpager; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_04, null); tab = view.findViewById(R.id.tab); viewpager = view.findViewById(R.id.viewpager); setTab(); viewpager.setAdapter(new FragmentPagerAdapter(getActivity().getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } @Override public CharSequence getPageTitle(int position) { return name[position]; } }); tab.setupWithViewPager(viewpager); return view; } private void setTab(){ for (int i = 0; i < 8; i++) { tab.addTab(tab.newTab().setText(name[i])); } list = new ArrayList<>(); for (int i = 0; i <8 ; i++) { list.add(new ZixunFragment()); } } }
ZixunFragment
public class ZixunFragment extends Fragment implements Iview{ private View view; private RecyclerView recycler; int P=1; private Myadapter adapter; private SwipeRefreshLayout swif; private LinearLayoutManager linearLayoutManager; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_zixun, null); swif = (SwipeRefreshLayout) view.findViewById(R.id.swif); recycler = view.findViewById(R.id.recycler); linearLayoutManager = new LinearLayoutManager(getContext()); recycler.setLayoutManager(linearLayoutManager); Persenter persenter=new Persenter(this); persenter.getok(Api.BASE_PATH+P); return view; } @Override public void showsuccess(final List<Bean.DataBean> list) { recycler.setLayoutManager(linearLayoutManager); adapter = new Myadapter(getContext(),list); recycler.setAdapter(adapter); recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition==list.size()-1){ P++; showsuccess(list); adapter.notifyDataSetChanged(); } } }); swif.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { P++; showsuccess(list); adapter.notifyDataSetChanged(); swif.setRefreshing(false); } }); } @Override public void error(String rr) { } }
MyAdapter
public class Myadapter extends RecyclerView.Adapter<Myadapter.ViewHolder> { Context context; List<Bean.DataBean> list; private View view; public Myadapter(Context context, List<Bean.DataBean> list) { this.context = context; this.list = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { view = View.inflate(context, R.layout.item, null); ViewHolder holder=new ViewHolder(view); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { Glide.with(context).load(list.get(position).pic_url).into(holder.image); holder.tv.setText(list.get(position).news_title); } @Override public int getItemCount() { return list.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public View rootView; public ImageView image; public TextView tv; public ViewHolder(View rootView) { super(rootView); this.rootView = rootView; this.image = (ImageView) rootView.findViewById(R.id.image); this.tv = (TextView) rootView.findViewById(R.id.tv); } } }
public class Api { public static final String BASE_PATH = "http://api.expoon.com/"; // public static final String BASE_URL = "https://api.github.com/"; // public static final String HOME_URL="http://api.expoon.com/AppNews/getNewsList/"; }
public interface ApiService { @GET("AppNews/getNewsList/type/1/p/") rx.Observable<Bean> getNoParams(); }
public class Bean {
public int status; public String info; public List<DataBean> data; public static Bean objectFromData(String str) { return new Gson().fromJson(str, Bean.class); } public static class DataBean {
public String news_id; public String news_title; public String news_summary; public String pic_url; public static DataBean objectFromData(String str) { return new Gson().fromJson(str, DataBean.class); } } }
public interface Imodel { void Request(String url, Onclick onclick); }
public class Model implements Imodel { private Retrofit retrofit; private ApiService apiService; private Observable<Bean> noParams; @Override public void Request(String url, final Onclick onclick) { retrofit = new Retrofit.Builder() .baseUrl(Api.BASE_PATH) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); //通过动态代理得到网络接口对象 apiService = retrofit.create(ApiService.class); noParams = apiService.getNoParams(); noParams.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Bean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onclick.error(e.getMessage().toString()); } @Override public void onNext(Bean bean) { List<Bean.DataBean> data = bean.data; onclick.datasuccess(data); } }); } }
public interface Onclick { void datasuccess(List<Bean.DataBean> list); void error(String rr); }
public class Persenter { Imodel imodel; Iview iview; public Persenter( Iview iview) { this.iview = iview; imodel=new Model(); } public void getok(String url){ imodel.Request(url, new Onclick() { @Override public void datasuccess(List<Bean.DataBean> list) { iview.showsuccess(list); } @Override public void error(String rr) { iview.error(rr); } }); } }
public interface Iview { void showsuccess(List<Bean.DataBean> bean); void error(String rr); }
主页面的布局
<com.hjm.bottomtabbar.BottomTabBar android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/bottom_tab_bar" ></com.hjm.bottomtabbar.BottomTabBar>
fragment_04
<android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" android:id="@+id/tab"></android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/viewpager"></android.support.v4.view.ViewPager>
fragment_zixun
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swif" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
item
<ImageView android:id="@+id/image" android:layout_width="150dp" android:layout_height="150dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="附件的方式的发送到" android:layout_gravity="center" />
相关文章推荐
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
- [置顶] Android 网络框架之Retrofit2使用详解及从源码中解析原理
- 使用MVP模式及retrofit框架实现登录
- 使用Retrofit+RxJava搭建简单的MVP网络请求框架
- MVP框架使用Fretiofit获取网络数据使用xrecycleview实现上拉加载下拉刷新
- Android---使用BottomTabBar实现底部导航页
- 使用MVP+Retrofit+RxJava实现的的Android Demo (下)使用Retrofit+RxJava处理网络请求
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
- Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现
- 使用rxjava,retrofit,okhttp实现mvp模式的数据解析
- (安卓) MVP 框架 (Rxjava2+Retrofit)结合 实现网络请求
- Retrofit网络框架的使用以及原理解析
- 使用MVP框架,retrofit结合Rxjava以及fresco加载图片,用recycleview实现
- android网络框架retrofit源码解析四
- 使用Volley网络框架实现ImageCache三级缓存
- 如何使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
- 主流移动应用开发框架(2)——fragment+fragmenttabhost实现底部选项卡导航(可滑动切换)
- android网络框架retrofit源码解析一
- Android开源网络请求框架Retrofit的介绍使用