Android開發框架Collection-kotlin(更新篇)

Collection聚合了項目搭建的一些基本模塊,節約開發者時間,協助項目的快速搭建,RecyclerView+Adapter+Retrofit+RxJava+MVP+DataManager+基本Base,可以知足一個項目的基本實現。java

推薦文件

Android X庫以前版本可以使用Collection-Android:juejin.im/post/5ab998…android

Collection-iOS庫:juejin.im/post/5e423d…git

Collection-kotlin做爲Collection-Android的更新篇,主要是爲了解決使用Android X庫帶來的一些問題以及模塊的優化

github地址:github.com/usernameyan…
簡書地址:www.jianshu.com/p/a6cb49532…

更新說明

v1.0.0

1.在Collection-Android的基礎上適配Android X庫
2.去掉Relam數據模塊,安裝包大小減小
3.對原生SQLite數據庫進行封裝,使用更加方便 4.對DataManager的使用進行修整 5.增長AutoLineLayout/TagView 6.增長LinkedMultiValueMap
7.增長RxJavaUtils,可進行子/主線程數據處理切換github

框架的引入

implementation 'com.youngman:collection_kotlin:1.0.0'數據庫

1、框架總體模塊

效果圖

2、PullToRefreshRecyclerView的使用

屬性 做用
addHeaderView 增長頭部佈局, 暫時只能添加一個頭佈局
setEmptyView 設置自定義的加載佈局和空佈局
setRefreshView 自定義刷新View
setDefaultLoadingMoreNoDataMessage 設置默認沒有數據的內容
setLoadMoreView 自定義加載更多View
setNoMoreDate 顯示沒有更多數據
setAutoRefresh 自動刷新
refreshComplete 刷新數據完成
loadMoreComplete 加載更多數據完成
setPullRefreshEnabled 是否容許刷新
setLoadMoreEnabled 是否容許加載更多
setRefreshTimeVisible 顯示加載更新時間
isLoading 是否正在loading數據
isRefreshing 正在refreshing數據
setRefreshAndLoadMoreListener 刷新和加載更多回調
destroy 內存回收

1.框架默認下拉刷新、上拉加載更多樣式

效果圖

(1)佈局文件
<com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
	android:id="@+id/recycler_rv"
	android:layout_width="match_parent"
	android:layout_height="match_parent" />
複製代碼
(2)代碼設置
recycler_rv.setPullRefreshEnabled(true)
 recycler_rv.setLoadMoreEnabled(true)
複製代碼

二、自定義下拉刷新、上拉加載更多樣式

效果圖

刷新幾種狀態:
屬性 做用
STATE_PULL_DOWN 拉的狀態(還沒到下拉到固定的高度時)
STATE_RELEASE_REFRESH 下拉到固定高度提示釋放刷新的狀態
STATE_REFRESHING 正在刷新狀態
STATE_DONE 刷新完成
加載更多幾種狀態:
屬性 做用
STATE_LOADING 正在加載
STATE_COMPLETE 加 載完成
STATE_NODATA 沒有數據
(1)代碼設置
recycler_rv.setPullRefreshEnabled(true)
recycler_rv.setLoadMoreEnabled(true)
recycler_rv.setRefreshAndLoadMoreListener(this)
recycler_rv.setRefreshView(DefinitionAnimationRefreshHeaderView(activity))
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity))
複製代碼
自定義刷新的步驟:
①自定義View繼承BasePullToRefreshView,重寫initView()、setRefreshTimeVisible(boolean show)、destroy()方法:

1.在initView()作自定義佈局、相關動畫的初始化,最後在initView()方法的最後面添加如下代碼便可。json

mContainer =
        LayoutInflater.from(context).inflate(R.layout.layout_definition_animation_refresh, null)
    //把刷新頭部的高度初始化爲0
    val lp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
    lp.setMargins(0, 0, 0, 0)
    this.layoutParams = lp
    this.setPadding(0, 0, 0, 0)
    addView(mContainer, LayoutParams(LayoutParams.MATCH_PARENT, 0))
    gravity = Gravity.BOTTOM

    //測量高度
    measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    mMeasuredHeight = measuredHeight
複製代碼

2.setRefreshTimeVisible(boolean show)是用來設置是否顯示刷新時間控件,在默認刷新樣式中經過mRecyclerView.setRefreshTimeVisible(false)便可隱藏刷新時間,若是在自定義的佈局中沒有這項這個方法就能夠忽略。api

3.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放,防止內存泄漏。緩存

②實現BasePullToRefreshView.OnStateChangeListener監聽(重點,主要是進行狀態切換後的相關操做邏輯)

1.在構造函數中設置 onStateChangeListener=this 2.onStateChange的模板樣式網絡

override fun onStateChange(state: Int) {

    if(isDestroy){
        return
    }
    //下拉時狀態相同不作繼續保持原有的狀態
    if (state == mState) return
    //根據狀態進行動畫顯示
    when (state) {
        STATE_PULL_DOWN -> {
            clearAnim()
            startAnim()
        }
        STATE_RELEASE_REFRESH -> {
        }
        STATE_REFRESHING -> {
            clearAnim()
            startAnim()
            scrollTo(mMeasuredHeight)
        }
        STATE_DONE -> {
        }
    }
    mState = state
}
複製代碼
自定義加載更多的步驟(包括沒有更多數據顯示的操做):
①自定義View繼承BaseLoadMoreView,重寫initView()、setState()、destroy()方法:

1.在initView()作自定義佈局、相關動畫的初始化,最後在initView()方法的最後面添加如下代碼便可app

mContainer = LayoutInflater.from(context)
        .inflate(R.layout.layout_definition_animation_loading_more, null)
    addView(mContainer)
    gravity = Gravity.CENTER
複製代碼

2.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放,防止內存泄漏。 3.在setState()進行狀態切換後的相關操做邏輯,模板樣式

override fun setState(state: Int) {

    if(isDestroy){
        return
    }

    when (state) {
        STATE_LOADING -> {
            loadMore_Ll?.visibility = VISIBLE
            noDataTv?.visibility = INVISIBLE
            animationDrawable = loadingIv?.drawable as AnimationDrawable
            animationDrawable?.start()
            this.visibility = VISIBLE
        }
        STATE_COMPLETE -> {
            animationDrawable?.stop()
            this.visibility = GONE
        }
        STATE_NODATA -> {
            loadMore_Ll?.visibility = INVISIBLE
            noDataTv?.visibility = VISIBLE
            animationDrawable = loadingIv?.drawable as AnimationDrawable
            animationDrawable?.start()
            this.visibility = VISIBLE
        }
    }

    mState = state
}
複製代碼

4.注意:在自定義加載更多樣式時,若是須要有沒有更多加載更多數據提示一樣須要在佈局中寫好,而後在onSatae中根據狀態對加載和沒有跟多顯示提示進行顯示隱藏操做。

三、上拉加載更多配合SwipeRefreshLayout使用

效果圖

(1)佈局文件
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

     <com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
        android:id="@+id/recycler_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
複製代碼
(2)代碼設置
recycler_rv.setLoadMoreEnabled(true)
recycler_rv.setRefreshAndLoadMoreListener(this)
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity))
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent)
swipeRefreshLayout.setOnRefreshListener(this)
複製代碼
(3)注意的問題

因爲PullToRefreshRecyclerView的下拉刷新和下拉加載更多完成時會自動刷新Adapter,而SwipeRefreshLayout刷新完成時須要手動進行notifyDataSetChanged刷新適配器。

四、RecyclerView添加頭部、空佈局

效果圖

(1)代碼設置
//增長頭布局
    val header = LayoutInflater.from(activity).inflate(R.layout.layout_main_header, null)
    recycler_rv.addHeaderView(header)

    //增長空佈局
    val emptyView = LayoutInflater.from(activity).inflate(R.layout.layout_empty, null)
    recycler_rv.emptyView = emptyView
    emptyView.setOnClickListener {
        for (i in 0..9) {
            mDatas.add("item$i")
        }
        definitionRefreshAdapter?.notifyDataSetChanged()
    }
複製代碼

五、上拉加載更多實現NoMoreData、自動刷新

效果圖

(1)上拉加載更多數據的佈局設置在上面的自定義LoadingMoreView中有介紹,若是要顯示沒有更多數據提示只須要在LoadMore返回數據以後設置:
mRecyclerView.setNoMoreDate(true)
複製代碼
(2)自動刷新須要列表已經填充了數據以後再作自動刷新操做纔會生效:
mRecyclerView.setAutoRefresh()
複製代碼

6.Collection庫的刷新加載文本已經適配了中文、英文、繁體,若是對默認刷新加載顯示文本進行修改,經過LoadingTextConfig設置,可在Application全局設置

val textConfig = LoadingTextConfig.getInstance(applicationContext)
textConfig
     .setCollectionLoadingMore("加載更多")
     .setCollectionLastRefreshTimeTip("更新時間:")
     .setCollectionNoMoreData("沒有更多數據")
     .setCollectionPullReleaseText("釋放刷新")
     .setCollectionRefreshing("正在刷新")
     .setCollectionPullDownRefreshText("下拉刷新")
     .setCollectionRefreshDone("加載完成")
 PullToRefreshRecyclerViewUtils.loadingTextConfig = textConfig
複製代碼

七、PullToRefreshRecyclerView的其餘使用以及注意問題

1.下面是下拉刷新上拉加載更多的一些操做模板

private fun refreshUI() {
    if (defaultRefreshAdapter == null) {
        defaultRefreshAdapter =
            DefaultRecyclerAdapter(
                activity!!,
                R.layout.item_pull_refresh,
                mDatas,
                recycler_rv
            )
        recycler_rv.adapter = defaultRefreshAdapter
    } else {
        if (recycler_rv != null) {
            if (recycler_rv.isLoading) {
                recycler_rv.loadMoreComplete()
            } else if (recycler_rv.isRefreshing) {
                recycler_rv.refreshComplete()
            }
        }
    }
}
複製代碼

2.注意問題

①在設置RecyclerView是要設LayoutManager
②若是使用PullToRefreshRecyclerView在Activty/Fragment中的onDestroy()調用mRecyclerView.destroy()防止內存泄漏。
@Override
public void onDestroy() {
	super.onDestroy();
	mRecyclerView?.destroy()
}
複製代碼
③設置refreshRv.setLoadMoreEnabled(true),當填充的數據的列表size爲0的同時還經過RecyclerView設置分割線底部就會出現一個空白的item,這個item就是加載更多顯示的Item。
解決辦法:不經過RecyclerView設置分割線,直接在佈局自定義分割線。

3、BaseRecyclerViewAdapter的使用

1.BaseRecyclerViewAdapter的比原始Adapter的代碼量減少

在BaseRecyclerViewAdapter中的BaseViewHolder進行佈局轉化,同時定義了一些比較基本的View操做,使用簡單。

(1)使用代碼:
class DefinitionRecyclerAdapter(
      mContext: Context,
      mLayoutResId: Int,
      mDatas: ArrayList<String>,
      pullToRefreshRecyclerView: PullToRefreshRecyclerView
) : BaseRecyclerViewAdapter<String>(mContext, mLayoutResId, mDatas, pullToRefreshRecyclerView) {

    override fun convert(baseViewHolder: BaseViewHolder, t: String) {
          baseViewHolder.setText(R.id.title, t)
    }
}
複製代碼
①使用者須要在繼承BaseRecyclerViewAdapter時傳入一個數據實體類型,具體的操做在convert()方法中操做。
②BaseViewHolder提供了一些經常使用View的基本操做,經過baseViewHolder.getView()可獲得佈局中的控件。
(2)BaseRecyclerViewAdapter提供了兩個構造函數
public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) {
	this.mContext = mContext;
	this.mLayoutResId = mLayoutResId;
	this.mDatas = mDatas;
	this.mRecyclerView=pullToRefreshRecyclerView;
}

public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas) {
	this.mContext = mContext;
	this.mLayoutResId = mLayoutResId;
	this.mDatas = mDatas;
}
複製代碼
主要是對PullToRefreshRecyclerView和RecyclerView的適配,使用時適配器根據須要使用對應的構造函數。

2.添加Item的點擊和長按事件

效果圖

(1)Item長按事件實現
itemClickAdapter.setOnItemLongClickListener(object :
        BaseRecyclerViewAdapter.onItemLongClickListener {
        override fun onItemLongClick(view: View, position: Int): Boolean {
            showToast("進行長按操做")
            return true
        }
    })
複製代碼

3.多佈局的使用

效果圖

BaseRecyclerViewAdapter的多佈局實現須要注意的四步:
①自定義Adapter須要繼承BaseRecyclerViewMultiItemAdapter。
② 數據實體類須要繼承BaseMultiItemEntity,在getItemViewType()返回佈局類型。
③ 在自定義Adapter中的構造函數中經過addItemType()傳入不一樣類型對應的佈局。
④在自定義Adapter中的convert進行類型判斷,作相對應的操做。
class MultipleAdapter(mContext: Context, mDatas: ArrayList<MultiItem>) :
BaseRecyclerViewMultiItemAdapter<MultiItem>(mContext, mDatas) {

    private var mHeight: Int=0

    init {
        mHeight = DisplayUtils.dip2px(mContext, 100f)
        addItemType(MultiItem.TYPE_TEXT, R.layout.item_main)
        addItemType(MultiItem.TYPE_IMG, R.layout.item_img)
        addItemType(MultiItem.TYPE_TEXT_IMG, R.layout.item_click)
  }

override fun convert(baseViewHolder: BaseViewHolder, t: MultiItem) {

    when (baseViewHolder.itemViewType) {
        MultiItem.TYPE_TEXT -> {
            baseViewHolder.getView<CardView>(R.id.card_view).layoutParams.height = mHeight
            baseViewHolder.setText(R.id.title, t.title)
        }
        MultiItem.TYPE_IMG -> baseViewHolder.setImageResource(R.id.ivImg, t.res)
        MultiItem.TYPE_TEXT_IMG -> {
            baseViewHolder.setImageResource(R.id.ivImg, t.res)
            baseViewHolder.setText(R.id.titleTv, t.title)
        }
    }
  }

}
複製代碼

4.添加拖拽、滑動刪除

效果圖

侷限:只針對RecyclerView,對本框架封裝的PullToRefreshRecyclerView會出現混亂。
①BaseRecyclerViewAdapter和BaseRecyclerViewMultiItemAdapter都已經封裝支持拖拽、滑動,適配器只須要根據需求繼承其中一個便可。
②框架提供了一個BaseRecycleItemTouchHelper,對於普通的左右滑動刪除、拖拽已經實現,若是想自定義能夠繼承BaseRecycleItemTouchHelper類,再重寫相對應的方法進行實現。
④在Activity/Fragment中須要實現如下代碼:
dragAndDeleteAdapter?.setDragAndDeleteListener(this)
    recycler_rv.adapter = dragAndDeleteAdapter

    val callback = BaseRecycleItemTouchHelper(dragAndDeleteAdapter)
    val itemTouchHelper = ItemTouchHelper(callback)
    itemTouchHelper.attachToRecyclerView(recycler_rv)
複製代碼
⑤BaseRecyclerViewAdapter.OnDragAndDeleteListener進行操做動做完成以後的回調。
override fun onMoveComplete() {
    ToastUtils.showToast(this, "移動操做完成")

}

override fun onDeleteComplete() {
    ToastUtils.showToast(this, "刪除操做完成")
}
複製代碼

4、MVP+RxJava+Retrofit的封裝使用

效果圖

1.在使用Retrofit請求網絡以前須要進行配置,在框架中提供了了Config配置類

屬性 做用
DEBUG 是否爲BuildConfig.DEBUG,日誌輸出須要
CONTEXT 設置Context,必填項
URL_DOMAIN 網絡請求的域名,須要以「/」結尾
URL_CACHE 網絡緩存地址,須要設置緩存才能夠成功
MAX_CACHE_SECONDS 設置OkHttp的緩存機制的最大緩存時間,默認爲一天
MAX_MEMORY_SIZE 緩存最大的內存,默認爲10M
MClASS 設置網絡請求json通用解析類
EXPOSEPARAM Json數據某些字段在沒有數據是會不返回來,可經過這個屬性設置過濾
USER_CONFIG SharePreference保存的名稱
CONNECT_TIMEOUT_SECONDS 請求接口超時設定
READ_TIMEOUT_SECONDS 請求接口超時設定
HEADERS 設置Http全局請求頭
SQLITE_DB_NAME 數據庫名稱
SQLITE_DB_VERSION 數據庫版本名
在項目中須要根據項目須要進行配置,在Application中設置
private fun config(){
    //基本配置
    Config.DEBUG = BuildConfig.DEBUG
    Config.CONTEXT = this
    Config.URL_CACHE = AppConfig.getURLCacheDir(this)
    Config.MClASS=HttpResult::class.java
    Config.USER_CONFIG = "Collection_User"
    Config.URL_DOMAIN = "https://api.apiopen.top/"
    Config.SQLITE_DB_VERSION=0
}
複製代碼
根據項目須要定義一個通用的數據實體類,這是本例通用實體類,這個類須要設置到Applicatin中
class HttpResult<T> : Serializable {
  var code: Int = 0
  var message: String? = null
  var result: T? = null
}
複製代碼
注意:因爲每一個項目返回來的json數據格式有所不一樣,若是Result中表明的字段例如newslist沒有內容返回來的時候這個字段須要後臺控制不返回,若是不作處理會報解析錯誤,能夠經過設置Config.EXPOSEPARAM屬性過濾字段。

2.RxJava+Retrofit+OkHttp

(1)RequestBuilder的設置(網絡請求的配置)

屬性 做用
ReqType 數據處理的方式,默認DEFAULT_CACHE_LIST,使用到OkHttp緩存的須要須要設置Config.URL_CACHE
NO_CACHE_MODEL 不設置緩存,返回model
NO_CACHE_LIST 不設置緩存,返回list
DEFAULT_CACHE_MODEL 使用Okttp默認緩存,返回model
DEFAULT_CACHE_LIST 使用Okttp默認緩存,返回list
DISK_CACHE_LIST_LIMIT_TIME 限時使用自定義磁盤緩存,返回List
DISK_CACHE_MODEL_LIMIT_TIME 限時使用自定義磁盤緩存,返回model
DISK_CACHE_NO_NETWORK_LIST 自定義磁盤緩存,沒有網絡返回磁盤緩存,返回List
DISK_CACHE_NO_NETWORK_MODEL /自定義磁盤緩存,沒有網絡返回磁盤緩存,返回Model
HttpType 網絡請求方式,默認DEFAULT_GET
DEFAULT_GET GET請求
DEFAULT_POST POST請求
FIELDMAP_POST 若是請求URL出現中文亂碼,可選擇這個
JSON_PARAM_POST json格式請求參數
ONE_MULTIPART_POST 上傳一張圖片
MULTIPLE_MULTIPART_POST 上傳多張圖片
ReqMode 請求模式,默認ASYNCHRONOUS
ASYNCHRONOUS 異步請求
SYNCHRONIZATION 同步請求
其它參數
setTransformClass 設置請求轉化Class
setUrl 設置請求url,若是不設置徹底鏈接則會使用Config.URL_DOMIN進行拼接
setFilePathAndFileName 設置自定義緩存時的路徑和文件名
setLimtHours 設置自定義緩存的有效時間
setHeader 設置請求頭
setHeaders 設置請求頭集合
setHttpTypeAndReqType 設置請求數據類型和請求方式
setImagePath 設置上傳圖片路徑
setImagePaths 設置多張圖片路徑
isUserCommonClass 設置是否使用公用類轉化
setReqMode 設置同步異步

(2)使用模塊

val requestBuilder=RequestBuilder(object :RxObservableListener<HttpResult<List<WeChatNews>>>(mView){
        override fun onNext(result: HttpResult<List<WeChatNews>>) {
            mView?.refreshUI(result.result)
        }
    })

    requestBuilder
        .setUrl(ApiUrl.URL_WETCHAT_FEATURED)
        .setTransformClass(WeChatNews().javaClass)
        .setHttpTypeAndReqType(RequestBuilder.HttpType.DEFAULT_GET,RequestBuilder.ReqType.NO_CACHE_LIST)
        .setParam("page",page)
        .setParam("type","video")
        .setParam("count",num)

    rxManager.addObserver(DataManager.DataForHttp.httpRequest(requestBuilder))
複製代碼
注意:
(1)RxObservableListener有三個回調方法
void onNext(T result);
void onComplete();
void onError(NetWorkCodeException.ResponseThrowable e);
複製代碼
只會重寫onNext方法,其它兩個方法能夠自行選擇重寫。
(2)RxObservableListener提供兩個構造函數
protected RxObservableListener(BaseView view){
    this.mView = view;
}

protected RxObservableListener(BaseView view, String errorMsg){
     this.mView = view;
     this.mErrorMsg = errorMsg;
}
複製代碼
這兩個構造函數主要主要是爲了統一處理onError的,若是要自定義錯誤提醒,則能夠選擇第二個構造函數。
(3)經過DataManager的網絡請求方式會返回來一個DisposableObserver,須要把它經過rxManager.addObserver()添加進CompositeDisposable才能正常執行,方便對網絡請求的銷燬管理。
(4)若是項目沒有統一的解析been類,那麼Config的公用類就不用設置了,在Retrofit請求的時候直接setTransformClass指定一個解析類就能夠了
(5)若是項目想兩種方式共存,那麼在請求的時候須要經過setUserCommonClass(false)設置才能不使用統一解析類進行解析

3.MVP

1.寫一個Contract類對Presenter和View進行統一管理(View須要實現BaseView,Presenter須要實現BasePresenter<T:BaseView>)

interface WeChatChinaNewsContract {
  interface View : BaseView {
    fun refreshUI(weChatNews: List<WeChatNews>?)
  }

  abstract class Presenter : BasePresenter<View>() {
      abstract fun requestChinaNews(context: Context, page: Int, num: Int)
  }
}
複製代碼

2.寫一個具體的Presenter類實現WeChatChinaNewsContract.Presenter,在裏面作具體的邏輯處理,處理完成再經過mView進行View的處理

3.Activity/Fragment實現IBaseActivity<T:BasePresenter>/IBaseFragment<T:BasePresenter>以及定義好的WeChatChinaNewsContract.View

4.缺陷:View在使用時須要轉化成在具體的子類才能調用相關方法。

5.具體使用能夠參照demo

5、DataManager的使用(Http、Sharepreference、SQLite)

效果圖

(1)DataManager基本屬性

屬性 做用
DataForSqlite 數據庫模塊
insert 插入bean數據
insertList 插入List數據
insertListBySync 異步插入List數據
queryByFirstByWhere 根據條件查詢
queryAll 查詢某個bean類的所有數據
queryAllBySync 異步查詢某個bean類的所有數據
queryByFirst 查詢某個bean類的第一條數據
delete 根據條件刪除數據
deleteAll 刪除某個bean類的全部數據
deleteTable 刪除數據表
update 更新某個bean類的
queryOfPageByWhere 根據條件分頁查詢,實體類必須包含PrimaryKey
queryOfPage 分頁查詢,實體類必須包含PrimaryKey
updateTable 更新數據表,用於增長字段
execQuerySQL Sql語句查詢
DataForHttp Http模塊
httpRequest 網絡請求,傳入RequestBuilder
DataForSharePreferences SharePreference模塊
saveObject 保存基本類型數據
getObject 獲取基本類型數據

(2)DataForSqlite

1.插入一條數據

var user= User()
  user.id=0
  user.age=24
  user.name="張三"
  var isSuccess=DataManager.DataForSqlite.insert(user)
  if(isSuccess!!){
     ToastUtils.showToast(activity,"保存成功")
   }else{
     ToastUtils.showToast(activity,"保存失敗")
   }
複製代碼

2.查詢數據

val user=DataManager.DataForSqlite.queryByFirst(User().javaClass)
ToastUtils.showToast(activity,"姓名:"+user?.name+"  "+"年齡:"+user?.age)
複製代碼

3.批量插入數據(可同步可異步)

var list=ArrayList<User>()
for (i in 0..10000){
     var user= User()
     user.id=i
     user.age=i
     user.name="張$i"
     list.add(user)
 }

 DataManager.DataForSqlite.insertListBySync(User().javaClass,list,object :SQLiteDataBase.InsertDataCompleteListener{
    override fun onInsertDataComplete(isInsert: Boolean?) {
         if(isInsert!!){
               ToastUtils.showToast(activity,"保存成功")
          }else{
              ToastUtils.showToast(activity,"保存失敗")
          }
      }
  })
複製代碼

4.bean類的定義

class User{
  @Column(isPrimaryKey = true)
  var id:Int=0
  var name:String?="你好"
  var age:Int?=0
}
複製代碼

其中能夠經過Column進行註解定義(isPrimaryKey、isNull、isUnique)

5.數據表格變化(只支持增長字段)

  • 修改數據庫版本號Config.SQLITE_DB_VERSION,往上遞增

  • 在Application中對版本號進行監聽,並對數據表進行更新

    SQLiteVersionMigrate().setMigrateListener(object :SQLiteVersionMigrate.MigrateListener{ override fun onMigrate(oldVersion: Int, newVersion: Int) { for (i in oldVersion..newVersion){ if(i==2){ }

    }
          }
    
    })
    複製代碼

(3)DataForHttp

val requestBuilder=RequestBuilder(object :RxObservableListener<HttpResult<List<WeChatNews>>>(mView){
        override fun onNext(result: HttpResult<List<WeChatNews>>) {
            mView?.refreshUI(result.result)
        }
 })

requestBuilder
        .setUrl(ApiUrl.URL_WETCHAT_FEATURED)
        .setTransformClass(WeChatNews().javaClass)
        .setHttpTypeAndReqType(RequestBuilder.HttpType.DEFAULT_GET,RequestBuilder.ReqType.NO_CACHE_LIST)
        .setParam("page",page)
        .setParam("type","video")
        .setParam("count",num)

rxManager.addObserver(DataManager.DataForHttp.httpRequest(requestBuilder))
複製代碼

(4)DataForSharePreferences

1.插入基本數據

DataManager.DataForSharePreferences.saveObject("user","這是一條測試的內容")
ToastUtils.showToast(activity,"保存成功")
複製代碼

2.查詢基本類型數據

val con=DataManager.DataForSharePreferences.getObject("user","")
ToastUtils.showToast(activity,con!!)
複製代碼

六.Base的使用

1.爲了方便Activity/Fragment設置頂部菜單欄,繼承IBaseActivity/IBaseFragment便可顯示一個簡單的頂部菜單,IBaseFragment的頂部菜單默認隱藏,下面以IBaseActivity的頂部菜單做爲例子
屬性 做用
isShowSystemActionBar 重寫該方法設置實現顯示系統ActionBar
isShowCustomActionBar 重寫該方法設置顯示自定義Bar
setCustomActionBar 重寫該方法設置自定義Bar
  • 若是使用默認自定義Bar可經過DefaultDefineActionBarConfig進行相關設置
屬性 做用
hideBackBtn 隱藏返回按鈕
setBarBackgroundColor 設置Bar的背景顏色
setBarHeight 設置Bar的高度
setTitleColor 設置標題顏色
setTitle 設置標題
setBackClick 設置返回按鈕監聽
  • 代碼使用

    defineActionBarConfig .setTitleSize(20f) .setBarHeight(DisplayUtils.dip2px(this,60f)) .setBarBackgroundColor(this,R.color.driver_font) .setTitle(getString(R.string.tab_Indicator_title))

2.StateView(數據加載頁面)

效果圖

屬性 做用
STATE_NO_DATA 不顯示加載框狀態碼
STATE_LOADING 加載數據顯示狀態碼
STATE_EMPTY 沒有數據顯示狀態碼
STATE_DISCONNECT 沒有網絡狀態碼
setOnDisConnectViewListener 點擊沒有網絡圖標回調
setOnEmptyViewListener 點擊沒有沒有數據圖標回調
showViewByState 設置顯示狀態
getmEmptyView 獲取無數據狀態View
佈局可設置參數
loadingViewAnimation 設置加載的drawable動畫
loadingText 加載時的文本
emptyImage 空佈局顯示的圖片
emptyText 空佈局文本
emptyViewRes 設置自定義空佈局
disConnectImage 設置斷網顯示的圖片
disConnectText 設置斷網顯示的文本
tipTextSize 文本字體大小
tipTextColor 文本字體顏色
(1)定義一個通用佈局
<com.youngmanster.collection_kotlin.base.stateview.StateView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:id="@+id/state_view">

</com.youngmanster.collection_kotlin.base.stateview.StateView >
複製代碼
(2)添加到Ui頁面的layout中
<include layout="@layout/layout_state"/>
複製代碼
注意:上面的語句添加的layout最外層最好是LinearLayout以及設置爲android:orientation="vertical"
(3)經過如下語句進行狀態切換
stateView.showViewByState(StateView.STATE_LOADING)
stateView.showViewByState(StateView.STATE_EMPTY)
stateView.showViewByState(StateView.STATE_NO_DATA)
stateView.showViewByState(StateView.STATE_DISCONNECT)
複製代碼

3.三步實現Permission(權限)設置

效果圖

(1)設置好要請求的權限
// 項目的必須權限,沒有這些權限會影響項目的正常運行
private val PERMISSIONS = arrayOf(
    Manifest.permission.READ_SMS,
    Manifest.permission.RECEIVE_WAP_PUSH,
    Manifest.permission.READ_CONTACTS
)
複製代碼
(2)權限經過PermissionManager管理
permissionManager = PermissionManager
    .with(this)
    .setNecessaryPermissions(PERMISSIONS)

permissionManager?.requestPermissions()
複製代碼
(3)頁面重寫onRequestPermissionsResult
//重寫
override fun onRequestPermissionsResult(requestCode: Int, @NonNull permissions: Array<String>, @NonNull grantResults: IntArray) {
    if (requestCode == PermissionManager.PERMISSION_REQUEST_CODE) {//PERMISSION_REQUEST_CODE爲請求權限的請求值
        //有必須權限選擇了禁止
        if (permissionManager?.shouldShowRequestPermissionsCode == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED) {
            ToastUtils.showToast(this, "能夠在這裏設置從新跳出權限請求提示框")
        } //有必須權限選擇了禁止不提醒
        else if (permissionManager?.shouldShowRequestPermissionsCode == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND) {
            ToastUtils.showToast(this, "能夠在這裏彈出提示框提示去應用設置頁開啓權限")
            permissionManager?.startAppSettings()
        }
    }
}
複製代碼
注意:若是有需求先判斷是否全部權限都已經容許以後再進入主頁面能夠經過permissionManager.isLackPermission()進行判斷,若是返回true則進行權限請求,若是返回false則進入主頁面。
  • 多個權限請求若是其中某一個被禁止提醒,會先把沒有禁止提醒的權限處理完以後再進行處理。
  • 若是是必要權限被禁止而沒有選擇禁止提醒退出以後下次會從新請求權限。
  • 若是必要權限被禁止和選擇了禁止提醒從新進入頁面在onRequestPermissionsResult會從新回調方法。
  • 使用者能夠根據onRequestPermissionsResult()方法中返回來的標誌PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED和PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND作出對應的顯示和操做(例如彈框提示跳轉到設置頁面或者toat提示)。

4.提供幾種比較經常使用的Dialog彈框

效果圖

(1)提供的經常使用的CommonDialog
屬性 做用
DIALOG_TEXT_TWO_BUTTON_DEFAULT 默認彈出按鈕提示
DIALOG_TEXT_TWO_BUTTON_CUSTOMIZE 自定義彈出按鈕提示
DIALOG_LOADING_PROGRASSBAR 默認加載彈框
DIALOG_CHOICE_ITEM 沒有數據顯示狀態碼

根據不一樣的構造函數設置不一樣的參數

(2)自定義Dialog樣式
  • BaseDialog
屬性 做用
setContentView 設置彈框佈局樣式
show 顯示彈框
isShowing 判斷彈框是否顯示
dismiss 彈框銷燬
setCancelable 點擊返回鍵和外部是否能夠取消
setOnBackPressDialogCancel 設置爲false時,點擊彈框外部不可消失,點擊返回按鈕能夠消失
setDialogInterval 設置彈框和屏幕兩邊的間距
setDialogHeight 設置彈框高度
  • 繼承BaseDialog,經過setContentView(R.layout.dialog_list)設置彈窗佈局。
  • 在提供的onViewCreated方法中進行相應的邏輯設置

5.自定義PopupWindow彈框

效果圖

  • BasePopupWindow
屬性 做用
BasePopupWindow(Context context) 調用該構造函數默認彈出框鋪滿全屏
BasePopupWindow(Context context, int w, int h) 自定義彈出框高寬
showPopup 在屏幕中央顯示彈框
showPopupAsDropDown 在指定控件底部顯示彈框
showPopup 在屏幕中央顯示彈框
showPopupAsDropDown 在指定控件底部顯示彈框
setShowMaskView 設置是否顯示遮層
dismiss 銷燬彈出框
getPopupLayoutRes 自定義彈出框的佈局文件
getPopupAnimationStyleRes 自定義彈出框的動畫文件,不設置動畫返回0
  • 繼承BasePopupWindow。
  • 經過getPopupLayoutRes(R.layout.xxx)設置彈窗佈局。
  • 經過getPopupAnimationStyleRes(R.style.xxx)設置彈窗動畫,不須要動畫能夠設置爲0。
  • 若是須要顯示遮層,在構造函數經過setShowMaskView(true)設置。

7、CustomView的使用

1.CommonTabLayout的使用

效果圖

屬性 做用
tab_tabIndicatorWidth 設置下滑線的長度
tab_tabIndicatorHeight 設置下滑線的高度
tab_tabIndicatorColor 下滑線顏色
tab_indicator_marginLeft 設置下滑線外邊距
tab_indicator_marginRight 設置下滑線外邊距
tab_indicator_marginTop 設置下滑線外邊距
tab_indicator_marginBottom 設置下滑線外邊距
tab_tabTextColor 沒選中字體顏色
tab_tabTextSize 字體大小
tab_tabSelectedTextColor 選中字體顏色
tab_padding 下滑線內邊距,block樣式時能夠經過該屬性設置距離
tab_tabBackground Tab 的背景顏色
tab_indicator_corner 下滑線的圓角大小
tab_indicator_gravity(bottom、top 設置下滑線顯示的位置,只針對line和triangle
tab_tabMode(scrollable、fixed) Tab的顯示模式
tab_indicator_style(line、triangle、block) 下滑線的樣式
具體可參照例子使用。

2.OutSideFrameTabLayout的使用

效果圖

屬性 做用
tab_tabIndicatorColor 設置Tab顏色
tab_indicator_corner 圓角大小
tab_indicator_marginLeft 下滑線外邊距
tab_indicator_marginRight 下滑線外邊距
tab_indicator_marginTop 下滑線外邊距
tab_indicator_marginBottom 下滑線外邊距
tab_tabTextColor 沒選中字體顏色
tab_tabSelectedTextColor 選中字體顏色
tab_tabTextSize 字體大小
tab_tabSelectedTextColor 選中字體顏色
tab_padding 內邊距
tab_bar_color bar的背景顏色
tab_bar_stroke_color 外框的顏色
tab_bar_stroke_width 外框的大小
tab_width bar的長度
具體可參照例子使用。

3.AutoLineLayout的使用

效果圖

  • 在外層佈局使用AutoLineLayout

    <com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
    
    </com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout>
    複製代碼

4.TagView的使用

效果圖

TagViewConfigBuilder
屬性 做用
setTitles 設置TagItem內容
setTextSize 設置TagItem字體大小
setTextColor 設置TagItem字體顏色
setTextSelectColor 設置TagItem選擇字體顏色
setPaddingLeftAndRight 設置TagIttem左右內邊距
setPaddingTopAndBottom 設置TagIttem上下內邊距
setMarginAndTopBottom 設置TagItem上下外邊距
setMarginLeftAndRight 設置TagItem左右外邊距
setackgroudRes 設置background Drawable
setTagViewAlign 設置總體TagItem的Align(LEFT,RIGHT,CENTER)
1.佈局
<com.youngmanster.collection_kotlin.base.customview.tagview.TagView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tagView" />
複製代碼
2.代碼設置
tagView.create(builder,object :TagView.TagViewPressListener{
        override fun onPress(view: View, title: String, position: Int) {
            ToastUtils.showToast(this@TagViewActivity,title)
        }
 })
複製代碼

8、工具類的使用

1.Density(適配不一樣手機像素)
  • 在Applicaton的onCreate中設置 Density.setDensity(this, 375f)
  • 375f表明設計稿的寬度,以dp爲單位,後面須要以f(浮點型)
2.DisplayUtils

效果圖

屬性 做用
px2dip px值轉換爲dip或dp值,保證尺寸大小不變(有精度損失)
px2dipByFloat px值轉換爲dip或dp值,保證尺寸大小不變(無精度損失
dip2px dip或dp值轉換爲px值,保證尺寸大小不變(有精度損失),相似Context.getDimensionPixelSize方法(四捨五入
dip2pxByFloat dip或dp值轉換爲px值,保證尺寸大小不變(無精度損失),相似Context.getDimension方法
px2sp px值轉換爲sp值,保證文字大小不變
sp2px sp值轉換爲px值,保證文字大小不變
getScreenWidthPixels 屏幕寬度
getScreenHeightPixels 屏幕高度
getDisplayInfo 獲取設備信息
setStatusBarBlackFontBgColor 設置黑色字體狀態的背景顏色
setStatusBarColor 設置狀態欄背景顏色
setStatusBarFullTranslucent 設置狀態欄透明
getStatusBarHeight 獲取狀態欄高度
getActionBarHeight 獲取ActionBar高度
3.ColorUtils
屬性 做用
createColorStateList 獲取ColorStateList
4.FileUtils
屬性 做用
WriterTxtFile 寫文件,其中append可設置是否添加在原內容的後邊
ReadTxtFile 讀取文本文件中的內容,strFilePath表明文件詳細路徑
isCacheDataFailure 判斷緩存是否失效
checkFileExists 檢查文件是否存在
checkSaveLocationExists 檢查是否安裝SD卡
deleteDirectory 刪除目錄(包括:目錄裏的全部文件)
deleteFile 刪除文件
getFileOrFilesSize 獲取文件指定文件的指定單位的大小,其中sizeType 獲取大小的類型1爲B、2爲KB、3爲MB、4爲GB
getFileSize 獲取指定文件大小
5.GetPermissionsUtils
屬性 做用
getAllPermissons 獲取應用用到的全部權限
6.GlideUtils
屬性 做用
loadImg 加載圖片
loadImgBlur Glide實現高斯模糊
loadImgBlur Glide實現高斯模糊,可設置模糊的程度
7.ThreadPoolManager:線程池管理類
8.LogUtils:日記工具類
9.NetworkUtils:網絡工具類
10.SoftInputUtils:鍵盤工具類
11.ToastUtils:Toast工具類
12.RxJavaUtil:主/子線程的切換

本文章會根據須要持續更新,建議點贊收藏,便於查看。也歡迎你們提出更多建議。

相關文章
相關標籤/搜索