MVP架构,网络请求库是RxJava & Retrofit + okhttp 图片加载是glide。
使用DrawerLayout + NavigationView 实现了侧滑菜单。
数据展示是RecyclerView 。
DrawerLayout + NavigationView
DrawerLayout 是google借鉴第三方控件如MenuDrawer提供的官方控件,用来侧滑菜单效果。DrawerLayout 分为侧滑菜单和主内容去,可以根据手势进行显示和隐藏。
现在通过对侧滑菜单中的选项进行点击,来切换主内容区中的fragment< 已实现内容的改变。
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view. -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
主内容区域的布局代码要放在侧滑菜单布局的前面,以帮助DrawerLayout来区分;侧滑菜单的部分的布局可以设置layout_gravity属性,来设置侧滑菜单是靠左还是靠右。用DrawerLayout.closeDrawer和openDrawer来控制侧滑菜单的显示和隐藏。
Navigation是一个导航菜单框架,一般用来配合DrawerLayout使用,来实现侧滑菜单的部分。
它有两个自定义属性 headlayout 和 menu,用来实现侧滑菜单的头部和列表部分。
用setNavigationItemSelectedListener来设置菜单项被点击时候的回调。
//如果是5.0以上 则使用toolbar替换actionBar
setSupportActionBar(toolbar);
//当前手机版本是否大于5.0
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
//对toolbar中的textview添加动画
``````
}
MVP
粗略,不准确的总结。
model是数据层 包括数据的获取,存储等
view是视图层,获取录入的数据,展示界面
presenter是逻辑处理层,调度model和view
view和presenter通过接口相互调用
/*Presenter中的一个方法*/
@Override
public void getMeiziData(int t) {
//显示进度条 对界面的操作 调用view的方法
mMeiziFragment.showProgressDialog();
//网络请求获取数据 数据的操作 调用model
Subscription subscription = ApiManage.getInstence().getGankService().getMeizhiData(t)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MeiziData>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
//获取失败 取消进度条 显示toast 界面的操作 调用view层
mMeiziFragment.hidProgressDialog();
mMeiziFragment.showError(e.getMessage());
}
@Override
public void onNext(MeiziData meiziData) {
//获取成功 取消进度条 更新数据 界面的操作 调用view层
mMeiziFragment.hidProgressDialog();
mCacheUtil.put(Config.ZHIHU, gson.toJson(meiziData));
mMeiziFragment.updateMeiziData(meiziData.getResults());
}
});
addSubscription(subscription);
}
在项目比较小的时候,可以用这种结构,将 presenter,adapter 等按类型存放。
RecyclerView
RecyclerView实现加载更多。
在滑动结束时判断是否已经滑动到底部。
new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) //向下滚动
{
//当前屏幕内可以容纳多少个可见的item
int visibleItemCount = mLinearLayoutManager.getChildCount();
//当前RecyclerView一共有多少个item
int totalItemCount = mLinearLayoutManager.getItemCount();
// 在当前屏幕中第一个可见的item处于RecyclerView的第几个
int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();
if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading = true;
loadMoreDate();
}
}
}
};