使用BottomTabBar实现底部导航,MVP网络框架,retrofit解析

本文介绍了如何在应用中集成BottomTabBar实现底部导航,并结合MVP架构和Retrofit网络框架进行数据请求与解析。通过详细步骤,展示了从添加依赖到创建各个Fragment和适配器的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加依赖

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)
                .addTabItem("资讯",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"
       />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值