Commit c57c4682edeb3346054f120c763f91d5e95288cb

Authored by 朱显松
2 parents 2797147c 16e2f477

Merge branch 'master' of bj.gitlab.cnlive.com:cnlive-team/OPenCNLive_BaseLib

Conflicts:
	app/build.gradle
	app/src/main/java/com/cnlive/libs/demo/MainActivity.java
	app/src/main/res/layout/activity_main.xml
app/src/main/AndroidManifest.xml
@@ -2,7 +2,6 @@ @@ -2,7 +2,6 @@
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.cnlive.libs.demo"> 3 package="com.cnlive.libs.demo">
4 4
5 -  
6 <application 5 <application
7 android:name=".App" 6 android:name=".App"
8 android:allowBackup="true" 7 android:allowBackup="true"
@@ -11,9 +10,7 @@ @@ -11,9 +10,7 @@
11 android:roundIcon="@mipmap/ic_launcher_round" 10 android:roundIcon="@mipmap/ic_launcher_round"
12 android:supportsRtl="true" 11 android:supportsRtl="true"
13 android:theme="@style/AppTheme"> 12 android:theme="@style/AppTheme">
14 -  
15 - <activity android:name=".MainActivity"/>  
16 - 13 + <activity android:name=".MainActivity" />
17 <activity 14 <activity
18 android:name=".mvptest.ui.activity.LaunchActivity" 15 android:name=".mvptest.ui.activity.LaunchActivity"
19 android:configChanges="keyboardHidden|screenSize|orientation" 16 android:configChanges="keyboardHidden|screenSize|orientation"
@@ -21,11 +18,11 @@ @@ -21,11 +18,11 @@
21 android:theme="@style/AppFullScreenTheme"> 18 android:theme="@style/AppFullScreenTheme">
22 <intent-filter> 19 <intent-filter>
23 <action android:name="android.intent.action.MAIN" /> 20 <action android:name="android.intent.action.MAIN" />
  21 +
24 <category android:name="android.intent.category.LAUNCHER" /> 22 <category android:name="android.intent.category.LAUNCHER" />
25 </intent-filter> 23 </intent-filter>
26 </activity> 24 </activity>
27 -  
28 - 25 + <activity android:name=".mvptest.ui.activity.LceTestActivity"></activity>
29 </application> 26 </application>
30 27
31 </manifest> 28 </manifest>
32 \ No newline at end of file 29 \ No newline at end of file
app/src/main/java/com/cnlive/libs/demo/MainActivity.java
1 package com.cnlive.libs.demo; 1 package com.cnlive.libs.demo;
2 2
  3 +import android.content.Intent;
3 import android.os.Bundle; 4 import android.os.Bundle;
4 import android.support.v7.app.AppCompatActivity; 5 import android.support.v7.app.AppCompatActivity;
  6 +import android.view.View;
  7 +
  8 +import com.cnlive.libs.demo.mvptest.ui.activity.LceTestActivity;
5 9
6 public class MainActivity extends AppCompatActivity { 10 public class MainActivity extends AppCompatActivity {
7 11
  12 +
8 @Override 13 @Override
9 protected void onCreate(Bundle savedInstanceState) { 14 protected void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState); 15 super.onCreate(savedInstanceState);
11 - } 16 + setContentView(R.layout.activity_main);
12 17
  18 + //Toast 测试
  19 + ToastTest.test(this);
  20 +
  21 + Java8Test.test(this);
  22 +
  23 + findViewById(R.id.lce_test).setOnClickListener(new View.OnClickListener() {
  24 + @Override
  25 + public void onClick(View view) {
  26 + startActivity(new Intent(MainActivity.this, LceTestActivity.class));
  27 + }
  28 + });
  29 + }
13 } 30 }
app/src/main/java/com/cnlive/libs/demo/data/network/testapi/ApiService.java
@@ -2,6 +2,7 @@ package com.cnlive.libs.demo.data.network.testapi; @@ -2,6 +2,7 @@ package com.cnlive.libs.demo.data.network.testapi;
2 2
3 3
4 import com.cnlive.libs.demo.data.model.AppInfo; 4 import com.cnlive.libs.demo.data.model.AppInfo;
  5 +import com.cnlive.libs.demo.mvptest.model.ExpertLibraryListBean;
5 6
6 import io.reactivex.Observable; 7 import io.reactivex.Observable;
7 import retrofit2.adapter.rxjava2.Result; 8 import retrofit2.adapter.rxjava2.Result;
@@ -21,4 +22,6 @@ public interface ApiService { @@ -21,4 +22,6 @@ public interface ApiService {
21 @GET("apps/info") 22 @GET("apps/info")
22 Observable<Result<AppInfo>> appInfo(@Query("app_id") int app_id); 23 Observable<Result<AppInfo>> appInfo(@Query("app_id") int app_id);
23 24
  25 + @GET("questions/experts")
  26 + Observable<Result<ExpertLibraryListBean>> questionsExperts();
24 } 27 }
app/src/main/java/com/cnlive/libs/demo/mvptest/frame/CountriesPresenter.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.frame;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.hannesdorfmann.mosby3.mvp.MvpPresenter;
  6 +
  7 +/**
  8 + * Created by Lynn on 2017/8/29.
  9 + */
  10 +
  11 +public interface CountriesPresenter extends MvpPresenter<CountriesView> {
  12 +
  13 + void loadData(Context context, final boolean pullToRefresh);
  14 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/frame/CountriesView.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.frame;
  2 +
  3 +import com.cnlive.libs.demo.mvptest.model.ExpertLibraryListBean;
  4 +import com.hannesdorfmann.mosby3.mvp.lce.MvpLceView;
  5 +
  6 +import java.util.List;
  7 +
  8 +
  9 +/**
  10 + * Created by Lynn on 2017/8/29.
  11 + */
  12 +
  13 +public interface CountriesView extends MvpLceView<List<ExpertLibraryListBean>> {
  14 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/frame/presenter/SimpleCountriesPresenter.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.frame.presenter;
  2 +
  3 +import android.content.Context;
  4 +import android.util.Log;
  5 +
  6 +import com.cnlive.libs.base.data.network.Subscriber;
  7 +import com.cnlive.libs.demo.data.network.testapi.ApiRequest;
  8 +import com.cnlive.libs.demo.data.network.testapi.ApiService;
  9 +import com.cnlive.libs.demo.mvptest.frame.CountriesPresenter;
  10 +import com.cnlive.libs.demo.mvptest.frame.CountriesView;
  11 +import com.cnlive.libs.demo.mvptest.model.ExpertLibraryListBean;
  12 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  13 +
  14 +import io.reactivex.disposables.Disposable;
  15 +
  16 +
  17 +/**
  18 + * Created by Lynn on 2017/8/29.
  19 + */
  20 +
  21 +public class SimpleCountriesPresenter extends MvpBasePresenter<CountriesView> implements CountriesPresenter {
  22 +
  23 + private static final String TAG = "CountriesPresenter";
  24 + private Disposable subscription;
  25 +
  26 + @Override
  27 + public void loadData(Context context, final boolean pullToRefresh) {
  28 + if (subscription != null) subscription.dispose();
  29 +
  30 + getView().showLoading(pullToRefresh);
  31 +
  32 + subscription = ApiRequest.subscribe(
  33 + ApiRequest.service(ApiService.class).questionsExperts(),
  34 + new Subscriber<ExpertLibraryListBean>(context) {
  35 + @Override
  36 + public void onCompleted(String code, String message, ExpertLibraryListBean data) {
  37 + getView().setData(data.getData());
  38 + getView().showContent();
  39 + }
  40 +
  41 + @Override
  42 + public void onError(String code, String message) {
  43 + getView().showError(null, pullToRefresh);
  44 + }
  45 + });
  46 + }
  47 +
  48 + @Override
  49 + public void detachView(boolean retainInstance) {
  50 + super.detachView(retainInstance);
  51 +
  52 + StringBuilder builder = new StringBuilder("---- detachView(" + retainInstance + ") ");
  53 + if (!retainInstance) {
  54 + builder.append(" --> cancel Loader");
  55 + }
  56 +
  57 + builder.append(" ----");
  58 + Log.d(TAG, builder.toString());
  59 + }
  60 +
  61 + @Override
  62 + public void attachView(CountriesView view) {
  63 + super.attachView(view);
  64 + Log.d(TAG, "attach view " + view.toString());
  65 + }
  66 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/model/ExpertLibraryListBean.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.model;
  2 +
  3 +
  4 +import android.os.Parcel;
  5 +import android.os.Parcelable;
  6 +
  7 +import com.cnlive.libs.demo.BR;
  8 +import com.cnlive.libs.demo.data.model.BaseInfo;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 创建:wukuiqing
  14 + * <p>
  15 + * 时间:2017/7/23
  16 + * <p>
  17 + * 描述:
  18 + */
  19 +
  20 +public class ExpertLibraryListBean extends BaseInfo<List<ExpertLibraryListBean>> {
  21 +
  22 +
  23 + /**
  24 + * id : 9
  25 + * name : 徐明(畜牧专家)
  26 + * sex : 男
  27 + * major : 反刍动物碳水化合物营养调控与奶牛营养工程技术体系
  28 + * title : 内蒙古农业大学教授
  29 + * avatar_url : //ymzx.asia-cloud.com/uploads/images/2017/0729/20170729134319730.png
  30 + * created_at : 2017-07-29 12:33:27
  31 + */
  32 +
  33 + private int id;
  34 + private String name;
  35 + private String sex;
  36 + private String major;
  37 + private String title;
  38 + private String avatar_url;
  39 + private String created_at;
  40 +
  41 + public int getId() {
  42 + return id;
  43 + }
  44 +
  45 + public void setId(int id) {
  46 + this.id = id;
  47 + }
  48 +
  49 + public String getName() {
  50 + return name;
  51 + }
  52 +
  53 + public void setName(String name) {
  54 + this.name = name;
  55 + }
  56 +
  57 + public String getSex() {
  58 + return sex;
  59 + }
  60 +
  61 + public void setSex(String sex) {
  62 + this.sex = sex;
  63 + }
  64 +
  65 + public String getMajor() {
  66 + return major;
  67 + }
  68 +
  69 + public void setMajor(String major) {
  70 + this.major = major;
  71 + }
  72 +
  73 + public String getTitle() {
  74 + return title;
  75 + }
  76 +
  77 + public void setTitle(String title) {
  78 + this.title = title;
  79 + }
  80 +
  81 + public String getAvatar_url() {
  82 + return avatar_url;
  83 + }
  84 +
  85 + public void setAvatar_url(String avatar_url) {
  86 + this.avatar_url = avatar_url;
  87 + }
  88 +
  89 + public String getCreated_at() {
  90 + return created_at;
  91 + }
  92 +
  93 + public void setCreated_at(String created_at) {
  94 + this.created_at = created_at;
  95 + }
  96 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/ui/activity/LceTestActivity.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.ui.activity;
  2 +
  3 +import android.support.annotation.NonNull;
  4 +import android.support.v4.widget.SwipeRefreshLayout;
  5 +import android.os.Bundle;
  6 +import android.support.v7.widget.LinearLayoutManager;
  7 +import android.support.v7.widget.RecyclerView;
  8 +import android.view.View;
  9 +
  10 +import com.cnlive.libs.base.frame.activity.MvpLceBindingActivity;
  11 +import com.cnlive.libs.demo.BR;
  12 +import com.cnlive.libs.demo.R;
  13 +import com.cnlive.libs.demo.databinding.ActivityLceTestBinding;
  14 +import com.cnlive.libs.demo.mvptest.frame.CountriesPresenter;
  15 +import com.cnlive.libs.demo.mvptest.frame.CountriesView;
  16 +import com.cnlive.libs.demo.mvptest.frame.presenter.SimpleCountriesPresenter;
  17 +import com.cnlive.libs.demo.mvptest.model.ExpertLibraryListBean;
  18 +import com.cnlive.libs.demo.mvptest.ui.activity.adapter.SimpleAdapter;
  19 +
  20 +import java.util.List;
  21 +
  22 +public class LceTestActivity extends MvpLceBindingActivity<SwipeRefreshLayout, List<ExpertLibraryListBean>, CountriesView, CountriesPresenter, ActivityLceTestBinding> implements CountriesView, SwipeRefreshLayout.OnRefreshListener {
  23 +
  24 + SimpleAdapter<ExpertLibraryListBean> adapter;
  25 +
  26 + @Override
  27 + protected void onCreate(Bundle savedInstanceState) {
  28 + super.onCreate(savedInstanceState);
  29 +
  30 + contentView.setOnRefreshListener(this);
  31 +// errorView.setOnClickListener(new View.OnClickListener() {
  32 +// @Override
  33 +// public void onClick(View view) {
  34 +// loadData(false);
  35 +// }
  36 +// });
  37 +
  38 + loadData(false);
  39 + }
  40 +
  41 + @NonNull
  42 + @Override
  43 + public int loadingViewId() {
  44 + return R.id.loading_view;
  45 + }
  46 +
  47 + @NonNull
  48 + @Override
  49 + public int contentViewId() {
  50 + return R.id.content_view;
  51 + }
  52 +
  53 + @NonNull
  54 + @Override
  55 + public int errorViewId() {
  56 + return R.id.error_view;
  57 + }
  58 +
  59 + @Override
  60 + public int getLayoutId() {
  61 + return R.layout.activity_lce_test;
  62 + }
  63 +
  64 + @Override
  65 + protected String getErrorMessage(Throwable e, boolean pullToRefresh) {
  66 + return null;
  67 + }
  68 +
  69 + @Override
  70 + public void onRefresh() {
  71 + loadData(true);
  72 + }
  73 +
  74 + @Override
  75 + public void showContent() {
  76 + super.showContent();
  77 + contentView.setRefreshing(false);
  78 + }
  79 +
  80 + @Override
  81 + public void setData(List<ExpertLibraryListBean> data) {
  82 + adapter = new SimpleAdapter<ExpertLibraryListBean>(data, R.layout.item_test, com.cnlive.libs.demo.BR.bean);
  83 + binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
  84 + binding.recyclerView.setAdapter(adapter);
  85 + }
  86 +
  87 + @NonNull
  88 + @Override
  89 + public CountriesPresenter createPresenter() {
  90 + return new SimpleCountriesPresenter();
  91 + }
  92 +
  93 + @Override
  94 + public void loadData(boolean pullToRefresh) {
  95 + presenter.loadData(this, pullToRefresh);
  96 + }
  97 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/ui/activity/adapter/SimpleAdapter.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.ui.activity.adapter;
  2 +
  3 +import android.databinding.DataBindingUtil;
  4 +import android.databinding.ViewDataBinding;
  5 +import android.support.v7.widget.RecyclerView;
  6 +import android.view.LayoutInflater;
  7 +import android.view.ViewGroup;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * Created by Lynn on 2017/8/30.
  13 + */
  14 +
  15 +public class SimpleAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
  16 +
  17 + private List<T> mDatas;
  18 +
  19 + private int layoutId;
  20 +
  21 + private int brId;
  22 +
  23 + public SimpleAdapter(List<T> mDatas, int layoutId, int brId) {
  24 + this.mDatas = mDatas;
  25 + this.layoutId = layoutId;
  26 + this.brId = brId;
  27 + }
  28 +
  29 + @Override
  30 + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  31 + LayoutInflater inflater = LayoutInflater.from(parent.getContext());
  32 + ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
  33 + ViewHolder viewHolder = new ViewHolder(binding.getRoot());
  34 + viewHolder.setBinding(binding);
  35 + return viewHolder;
  36 + }
  37 +
  38 + @Override
  39 + public void onBindViewHolder(ViewHolder holder, int position) {
  40 + holder.getBinding().setVariable(brId, mDatas.get(position));
  41 + holder.getBinding().executePendingBindings();
  42 + }
  43 +
  44 + @Override
  45 + public int getItemCount() {
  46 + return mDatas == null ? 0 : mDatas.size();
  47 + }
  48 +}
app/src/main/java/com/cnlive/libs/demo/mvptest/ui/activity/adapter/ViewHolder.java 0 → 100644
  1 +package com.cnlive.libs.demo.mvptest.ui.activity.adapter;
  2 +
  3 +import android.databinding.ViewDataBinding;
  4 +import android.support.v7.widget.RecyclerView;
  5 +import android.view.View;
  6 +
  7 +/**
  8 + * Created by Lynn on 2017/8/30.
  9 + */
  10 +
  11 +public class ViewHolder extends RecyclerView.ViewHolder {
  12 + private ViewDataBinding binding;
  13 +
  14 + public ViewDataBinding getBinding() {
  15 + return binding;
  16 + }
  17 +
  18 + public void setBinding(ViewDataBinding binding) {
  19 + this.binding = binding;
  20 + }
  21 +
  22 + public ViewHolder(View itemView) {
  23 + super(itemView);
  24 + }
  25 +}
app/src/main/res/drawable-hdpi/load_error.png 0 → 100644

1.83 KB

app/src/main/res/layout/activity_lce_test.xml 0 → 100644
  1 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:tools="http://schemas.android.com/tools">
  3 +
  4 + <FrameLayout
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent">
  7 +
  8 + <include layout="@layout/loading_view" />
  9 +
  10 + <include layout="@layout/error_view" />
  11 +
  12 + <android.support.v4.widget.SwipeRefreshLayout
  13 + android:id="@+id/content_view"
  14 + android:layout_width="match_parent"
  15 + android:layout_height="match_parent">
  16 +
  17 + <android.support.v7.widget.RecyclerView
  18 + android:id="@+id/recycler_view"
  19 + android:layout_width="match_parent"
  20 + android:layout_height="match_parent" />
  21 +
  22 + </android.support.v4.widget.SwipeRefreshLayout>
  23 +
  24 + </FrameLayout>
  25 +
  26 +</layout>
0 \ No newline at end of file 27 \ No newline at end of file
app/src/main/res/layout/activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 -<layout xmlns:android="http://schemas.android.com/apk/res/android" 2 +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 - xmlns:tools="http://schemas.android.com/tools">  
5 -  
6 - <data>  
7 -  
8 - <variable  
9 - name="data"  
10 - type="String" />  
11 - </data>  
12 -  
13 - <android.support.constraint.ConstraintLayout 4 + xmlns:tools="http://schemas.android.com/tools"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + tools:context="com.cnlive.libs.demo.MainActivity">
  8 +
  9 + <!--<TextView-->
  10 + <!--android:id="@+id/textView"-->
  11 + <!--android:layout_width="wrap_content"-->
  12 + <!--android:layout_height="wrap_content"-->
  13 + <!--android:text="Hello World!"-->
  14 + <!--app:layout_constraintBottom_toBottomOf="parent"-->
  15 + <!--app:layout_constraintLeft_toLeftOf="parent"-->
  16 + <!--app:layout_constraintRight_toRightOf="parent"-->
  17 + <!--app:layout_constraintTop_toTopOf="parent" />-->
  18 +
  19 + <Button
  20 + android:id="@+id/lce_test"
14 android:layout_width="match_parent" 21 android:layout_width="match_parent"
15 - android:layout_height="match_parent"  
16 - tools:context="com.cnlive.libs.demo.MainActivity">  
17 -  
18 - <Button  
19 - android:layout_width="368dp"  
20 - android:layout_height="wrap_content"  
21 - android:layout_marginBottom="8dp"  
22 - android:layout_marginLeft="8dp"  
23 - android:layout_marginRight="8dp"  
24 - android:layout_marginTop="8dp"  
25 - android:onClick="onAddItemClick"  
26 - android:text="Add Item"  
27 - app:layout_constraintBottom_toBottomOf="parent"  
28 - app:layout_constraintHorizontal_bias="0.0"  
29 - app:layout_constraintLeft_toLeftOf="parent"  
30 - app:layout_constraintRight_toRightOf="parent"  
31 - app:layout_constraintTop_toTopOf="parent"  
32 - app:layout_constraintVertical_bias="0.0" />  
33 -  
34 - <TextView  
35 - android:id="@+id/textView"  
36 - android:layout_width="wrap_content"  
37 - android:layout_height="wrap_content"  
38 - android:text="Hello World!"  
39 - app:layout_constraintBottom_toBottomOf="parent"  
40 - app:layout_constraintLeft_toLeftOf="parent"  
41 - app:layout_constraintRight_toRightOf="parent"  
42 - app:layout_constraintTop_toTopOf="parent" />  
43 -  
44 -  
45 - </android.support.constraint.ConstraintLayout> 22 + android:layout_height="wrap_content"
  23 + android:text="Lce Test" />
46 24
47 -</layout> 25 +</android.support.constraint.ConstraintLayout>
app/src/main/res/layout/error_view.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<merge xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent">
  5 +
  6 + <TextView
  7 + android:id="@+id/error_view"
  8 + android:layout_width="wrap_content"
  9 + android:layout_height="wrap_content"
  10 + android:layout_gravity="center"
  11 + android:drawablePadding="16dp"
  12 + android:drawableTop="@drawable/load_error"
  13 + android:gravity="center"
  14 + android:padding="16dp"
  15 + android:text="加载失败,请点击重试"
  16 + android:textColor="#656565"
  17 + android:textSize="20sp" />
  18 +
  19 +
  20 +</merge>
0 \ No newline at end of file 21 \ No newline at end of file
app/src/main/res/layout/item_test.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto">
  4 +
  5 + <data>
  6 +
  7 + <variable
  8 + name="bean"
  9 + type="com.cnlive.libs.demo.mvptest.model.ExpertLibraryListBean" />
  10 + </data>
  11 +
  12 + <LinearLayout
  13 + android:layout_width="match_parent"
  14 + android:layout_height="wrap_content"
  15 + android:orientation="vertical">
  16 +
  17 + <TextView
  18 + android:id="@+id/name"
  19 + android:layout_width="match_parent"
  20 + android:layout_height="wrap_content"
  21 + android:padding="16dp"
  22 + android:text="@{bean.name}" />
  23 +
  24 + </LinearLayout>
  25 +</layout>
0 \ No newline at end of file 26 \ No newline at end of file
app/src/main/res/layout/loading_view.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<merge xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent">
  5 +
  6 + <ProgressBar
  7 + android:id="@+id/loading_view"
  8 + android:layout_width="wrap_content"
  9 + android:layout_height="wrap_content"
  10 + android:layout_gravity="center"
  11 + android:indeterminate="true" />
  12 +</merge>
0 \ No newline at end of file 13 \ No newline at end of file
cnlive/src/main/java/com/cnlive/libs/base/frame/activity/MvpLceActivity.java 0 → 100644
  1 +package com.cnlive.libs.base.frame.activity;
  2 +
  3 +import android.os.Bundle;
  4 +import android.support.annotation.NonNull;
  5 +import android.view.View;
  6 +import android.widget.Toast;
  7 +
  8 +import com.hannesdorfmann.mosby3.mvp.*;
  9 +import com.hannesdorfmann.mosby3.mvp.lce.LceAnimator;
  10 +import com.hannesdorfmann.mosby3.mvp.lce.MvpLceView;
  11 +
  12 +/**
  13 + * Created by Lynn on 2017/8/30.
  14 + */
  15 +
  16 +public abstract class MvpLceActivity<CV extends View, M, V extends MvpLceView<M>, P extends MvpPresenter<V>>
  17 + extends com.hannesdorfmann.mosby3.mvp.MvpActivity<V, P> implements MvpLceView<M> {
  18 +
  19 + protected View loadingView;
  20 + protected CV contentView;
  21 + protected View errorView;
  22 +
  23 + @Override
  24 + protected void onCreate(Bundle savedInstanceState) {
  25 + super.onCreate(savedInstanceState);
  26 + setContentView(getLayoutId());
  27 + }
  28 +
  29 + @Override
  30 + public void onContentChanged() {
  31 + super.onContentChanged();
  32 +
  33 + loadingView = findViewById(loadingViewId());
  34 + contentView = (CV) findViewById(contentViewId());
  35 + errorView = findViewById(errorViewId());
  36 +
  37 + if (loadingView == null) {
  38 + throw new NullPointerException(
  39 + "Loading view is null! Have you specified a loading view in your layout xml file?");
  40 + }
  41 +
  42 + if (contentView == null) {
  43 + throw new NullPointerException(
  44 + "Content view is null! Have you specified a content view in your layout xml file?");
  45 + }
  46 +
  47 + if (errorView == null) {
  48 + throw new NullPointerException(
  49 + "Error view is null! Have you specified an error view in your layout xml file?");
  50 + }
  51 +
  52 +// errorView.setOnClickListener(new View.OnClickListener() {
  53 +// @Override
  54 +// public void onClick(View v) {
  55 +// onErrorViewClicked();
  56 +// }
  57 +// });
  58 + }
  59 +
  60 + @NonNull
  61 + public abstract int loadingViewId();
  62 +
  63 + @NonNull
  64 + public abstract int contentViewId();
  65 +
  66 + @NonNull
  67 + public abstract int errorViewId();
  68 +
  69 + public abstract int getLayoutId();
  70 +
  71 + @NonNull
  72 + @Override
  73 + public P createPresenter() {
  74 + return null;
  75 + }
  76 +
  77 +// protected void onErrorViewClicked() {
  78 +// loadData(false);
  79 +// }
  80 +
  81 + @Override
  82 + public void showLoading(boolean pullToRefresh) {
  83 +
  84 + if (!pullToRefresh) {
  85 + animateLoadingViewIn();
  86 + }
  87 +
  88 + }
  89 +
  90 + protected void animateLoadingViewIn() {
  91 + LceAnimator.showLoading(loadingView, contentView, errorView);
  92 + }
  93 +
  94 + @Override
  95 + public void showContent() {
  96 + animateContentViewIn();
  97 + }
  98 +
  99 + protected void animateContentViewIn() {
  100 + LceAnimator.showContent(loadingView, contentView, errorView);
  101 + }
  102 +
  103 + protected abstract String getErrorMessage(Throwable e, boolean pullToRefresh);
  104 +
  105 + protected void showLightError(String msg) {
  106 + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
  107 + }
  108 +
  109 + @Override
  110 + public void showError(Throwable e, boolean pullToRefresh) {
  111 +
  112 + String errorMsg = getErrorMessage(e, pullToRefresh);
  113 +
  114 + if (pullToRefresh) {
  115 + showLightError(errorMsg);
  116 + } else {
  117 + animateErrorViewIn();
  118 + }
  119 + }
  120 +
  121 + protected void animateErrorViewIn() {
  122 + LceAnimator.showErrorView(loadingView, contentView, errorView);
  123 + }
  124 +}
cnlive/src/main/java/com/cnlive/libs/base/frame/activity/MvpLceBindingActivity.java 0 → 100644
  1 +package com.cnlive.libs.base.frame.activity;
  2 +
  3 +import android.databinding.DataBindingUtil;
  4 +import android.databinding.ViewDataBinding;
  5 +import android.os.Bundle;
  6 +import android.support.annotation.NonNull;
  7 +import android.view.View;
  8 +
  9 +import com.hannesdorfmann.mosby3.mvp.MvpPresenter;
  10 +import com.hannesdorfmann.mosby3.mvp.lce.MvpLceView;
  11 +
  12 +/**
  13 + * Created by Lynn on 2017/8/30.
  14 + */
  15 +
  16 +public abstract class MvpLceBindingActivity<CV extends View, M, V extends MvpLceView<M>, P extends MvpPresenter<V>, T extends ViewDataBinding> extends MvpLceActivity<CV, M, V, P> {
  17 +
  18 + public T binding;
  19 +
  20 + @Override
  21 + protected void onCreate(Bundle savedInstanceState) {
  22 + super.onCreate(savedInstanceState);
  23 + binding = DataBindingUtil.setContentView(this, getLayoutId());
  24 + }
  25 +}
cnlive/src/main/java/com/cnlive/libs/base/frame/fragment/MvpLceBindingFragment.java 0 → 100644
  1 +package com.cnlive.libs.base.frame.fragment;
  2 +
  3 +import android.databinding.DataBindingUtil;
  4 +import android.databinding.ViewDataBinding;
  5 +import android.os.Bundle;
  6 +import android.support.annotation.Nullable;
  7 +import android.view.LayoutInflater;
  8 +import android.view.View;
  9 +import android.view.ViewGroup;
  10 +
  11 +import com.hannesdorfmann.mosby3.mvp.MvpPresenter;
  12 +import com.hannesdorfmann.mosby3.mvp.lce.MvpLceView;
  13 +
  14 +/**
  15 + * Created by Lynn on 2017/8/30.
  16 + */
  17 +
  18 +public abstract class MvpLceBindingFragment<CV extends View, M, V extends MvpLceView<M>, P extends MvpPresenter<V>, T extends ViewDataBinding> extends MvpLceFragment<CV, M, V, P> {
  19 +
  20 + public T binding;
  21 +
  22 + @Nullable
  23 + @Override
  24 + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  25 + binding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
  26 + return binding.getRoot();
  27 + }
  28 +
  29 +}
cnlive/src/main/java/com/cnlive/libs/base/frame/fragment/MvpLceFragment.java 0 → 100644
  1 +package com.cnlive.libs.base.frame.fragment;
  2 +
  3 +import android.os.Bundle;
  4 +import android.support.annotation.CallSuper;
  5 +import android.support.annotation.NonNull;
  6 +import android.support.annotation.Nullable;
  7 +import android.view.LayoutInflater;
  8 +import android.view.View;
  9 +import android.view.ViewGroup;
  10 +import android.widget.Toast;
  11 +
  12 +import com.hannesdorfmann.mosby3.mvp.*;
  13 +import com.hannesdorfmann.mosby3.mvp.lce.LceAnimator;
  14 +import com.hannesdorfmann.mosby3.mvp.lce.MvpLceView;
  15 +
  16 +/**
  17 + * Created by Lynn on 2017/8/30.
  18 + */
  19 +
  20 +public abstract class MvpLceFragment<CV extends View, M, V extends MvpLceView<M>, P extends MvpPresenter<V>>
  21 + extends com.hannesdorfmann.mosby3.mvp.MvpFragment<V, P> implements MvpLceView<M> {
  22 + protected View loadingView;
  23 + protected CV contentView;
  24 + protected View errorView;
  25 +
  26 + @CallSuper
  27 + @Override
  28 + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  29 + super.onViewCreated(view, savedInstanceState);
  30 + setUpViews(view);
  31 + }
  32 +
  33 +
  34 + @Nullable
  35 + @Override
  36 + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  37 + return inflater.inflate(getLayoutId(), container, false);
  38 + }
  39 +
  40 + public void setUpViews(View view) {
  41 + loadingView = view.findViewById(loadingViewId());
  42 + contentView = view.findViewById(contentViewId());
  43 + errorView = view.findViewById(errorViewId());
  44 +
  45 + if (loadingView == null) {
  46 + throw new NullPointerException(
  47 + "Loading view is null! Have you specified a loading view in your layout xml file?");
  48 + }
  49 +
  50 + if (contentView == null) {
  51 + throw new NullPointerException(
  52 + "Content view is null! Have you specified a content view in your layout xml file?");
  53 + }
  54 +
  55 + if (errorView == null) {
  56 + throw new NullPointerException(
  57 + "Error view is null! Have you specified a error view in your layout xml file?");
  58 + }
  59 +
  60 +// errorView.setOnClickListener(new View.OnClickListener() {
  61 +// @Override
  62 +// public void onClick(View view) {
  63 +// onErrorViewClicked();
  64 +// }
  65 +// });
  66 + }
  67 +
  68 +
  69 + @NonNull
  70 + public abstract int loadingViewId();
  71 +
  72 + @NonNull
  73 + public abstract int contentViewId();
  74 +
  75 + @NonNull
  76 + public abstract int errorViewId();
  77 +
  78 + public abstract int getLayoutId();
  79 +
  80 +
  81 + @Override
  82 + public void showLoading(boolean pullToRefresh) {
  83 + if (!pullToRefresh) {
  84 + animateLoadingViewIn();
  85 + }
  86 + }
  87 +
  88 + protected void animateLoadingViewIn() {
  89 + LceAnimator.showLoading(loadingView, contentView, errorView);
  90 + }
  91 +
  92 + @Override
  93 + public void showContent() {
  94 + animateContentViewIn();
  95 + }
  96 +
  97 + protected void animateContentViewIn() {
  98 + LceAnimator.showContent(loadingView, contentView, errorView);
  99 + }
  100 +
  101 + protected abstract String getErrorMessage(Throwable e, boolean pullToRefresh);
  102 +
  103 + protected void showLightError(String msg) {
  104 + if (getActivity() != null) {
  105 + Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
  106 + }
  107 + }
  108 +
  109 +// protected void onErrorViewClicked() {
  110 +// loadData(false);
  111 +// }
  112 +
  113 + @Override
  114 + public void showError(Throwable e, boolean pullToRefresh) {
  115 + String errorMsg = getErrorMessage(e, pullToRefresh);
  116 + if (pullToRefresh) {
  117 + showLightError(errorMsg);
  118 + } else {
  119 + animateErrorViewIn();
  120 + }
  121 + }
  122 +
  123 + protected void animateErrorViewIn() {
  124 + LceAnimator.showErrorView(loadingView, contentView, errorView);
  125 + }
  126 +
  127 + @Override
  128 + public void onDestroyView() {
  129 + super.onDestroyView();
  130 + loadingView = null;
  131 + contentView = null;
  132 + errorView.setOnClickListener(null);
  133 + errorView = null;
  134 + }
  135 +}