前言
Recyclerview下拉、上拉刷新的第三方庫已經有很多了,用過XRecyclerview跟SuperRecyclerview,之前用XRecyclerview的時候,就遇到過在安卓5.0以下的部分手機,會出現不顯示的情況,後來就換了SuperRecyclerview,用了一段時間後,發現在下拉刷新的時候,如果實現list.clear()則會閃退,找了好久沒找到原因。後面就用了其他幾個第三方庫;
這三個庫相當的強大,具體使用可以查看上面的傳送門,用這些庫實現一個多功能的Recyclerview是沒問題的,但是每個庫都有自己的優點以及缺點,而且每個庫都有自己的方法,如果直接使用,你就會發現,實現功能的時候,會繼承各種各樣的方法,比較雜,比較亂。
基於以上的問題,結合這幾個庫的優點,並且把一些公用的方法整合在一起,於是乎,就衍生出這個項目
項目導入
- 項目已經上傳到GitHub上,想看源碼的,這兒有傳送門
- 當然項目也已經上傳到jcenter上了,只需在gradle添加即可使用這個庫
compile 'com.hebin:hxbrecyclerview:1.0.4'
項目使用
佈局使用
<com.hebin.HxbRecyclerview
android:id="@+id/hrMain"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
使用Adapter
class RefreshAdapter(layout: Int, var list: MutableList<TestEntity.ResultEntity>)
: BaseHxbAdapter<TestEntity.ResultEntity, BaseViewHolder>(layout, list) {
override fun convert(holder: BaseViewHolder, item: TestEntity.ResultEntity, position: Int) {
// 設置文本
holder.setText(R.id.tvTitle, item.title)
// 添加點擊事件
.addOnClickListener(R.id.tvTitle)
// 添加長按事件
.addOnLongClickListener(R.id.tvTitle)
}
}
設置佈局樣式
// 設置垂直線性佈局
hrMain.setVerticalLinear()
// 設置水平線性佈局
hrMain.setHorizontalLinear()
// 設置九宮格佈局
hrMain.setGridLayout(3)
點擊事件
在Adapter中實現了點擊事件,那麼在Activity中就可以執行點擊事件的操作
class TestActivity : AppCompatActivity(), HxbRecyclerview.Listener {
fun setList() {
val hrMain = HxbRecyclerview(this)
val adapter = RefreshAdapter(R.layout.adapter_refresh,mList)
hrMain.setListener(this)
}
override fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) {
super.onItemClick(adapter, view, position)
}
}
Listener 接口實現了幾個方法,只要在Activity中繼承了HxbRecyclerview.Listener,都可以實現,當然,如果沒用到也可以不寫,沒有強制要求重寫全部方法;
interface Listener {
fun onRefresh() {}
fun onLoadMore() {}
fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) {}
fun onItemLongClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) {}
}
下拉刷新、上拉刷新
只要在Activity中繼承了HxbRecyclerview.Listener,即可通過onRefresh和onLoadMore方法實現下拉、上拉刷新
hrMain.setListener(this)
// 下拉刷新
override fun onRefresh() {
}
// 上拉加載更多
override fun onLoadMore() {
}
刷新(加載更多)之後,可實現的幾個方法
// 完成下拉刷新
hrMain.refreshComplete()
// 完成上拉加載
hrMain.loadMoreComplete()
// 上拉加載失敗
hrMain.loadFailed()
// 沒有更多數據
hrMain.setNomore()
當然,下拉刷新的樣式、上拉加載的樣式是可以自定義的;下拉、上拉中使用的動畫效果來源於AVLoadingIndicatorView,想要簡單的更換樣式,可以參考這個庫;
// 更換下拉動畫樣式
hrMain.setIndicatorId(AVLoadingIndicatorView.BallPulseRise)
// 更換下拉動畫的顏色
hrMain.setIndicatorColor(Color.parseColor("#F00000"))
// 更換上拉動畫樣式
hrMain.setBottomIndicatorId(AVLoadingIndicatorView.BallPulseRise)
// 更換上拉動畫的顏色
hrMain.setBottomIndicatorColor(Color.parseColor("#F00000"))
除了動畫可以自定義,下拉里面的其他東西都是可以自定義的
// 設置下拉箭頭圖片
hrMain.setArrowResource(resId)
// 設置下拉文字顏色
hrMain.setTextColor(color)
// 設置下拉的文字
hrMain.setPullDownStr(str)
// 設置下拉刷新完成的文字
hrMain.setPullDownStr(str)
// 設置下拉正在刷新的文字
hrMain.setPullDownStr(str)
當然,如果你不喜歡這個下拉頭部,你也可以自定義一個下拉頭部,只要繼承IHeaderView 即可,具體怎樣實現可以參考HxbRefreshView和HxbLoadView,最後別忘了設置
// 自定義下拉刷新佈局
hrMain.setHeadView(HxbRefreshView(context))
// 自定義上拉刷新佈局
hrMain.setBottomView(HxbLoadView(context))
如果請求返回數據爲空,列表也可以通過setEmpty來顯示空佈局,空佈局點擊的時候,默認執行onRefresh的操作
hrMain.setEmpty()
當然,空佈局、上拉加載失敗佈局、上拉沒有更多數據佈局都是可以自定義的,通過以下幾個方法實現
// 數據爲空的佈局
hrMain.setEmptyView(view)
// 加載失敗的佈局
hrMain.setFailView(view)
// 沒有更多數據的佈局
hrMain.setNomoreView(view)
還可以設置上拉、下拉越界的最大高度,以及刷新時的固定高度
// 下拉刷新的固定高度
hrMain.setHeadHeight(60f)
// 下拉刷新的越界最大高度
hrMain.setMaxHeadHeight(120f)
其他刷新功能
// 開啓或者關閉刷新
hrMain.setEnableRefresh(true)
// 開啓或者關閉加載更多
hrMain.setEnableLoadmore(true)
// 強制刷新
hrMain.startRefresh()
// 強制加載更多
hrMain.startLoadMore()
// 隱藏全部刷新佈局
hrMain.setPureScrollModeOn
// 懸浮式下拉刷新
hrMain.setFloatRefresh
多佈局列表
在開發過程中往往會遇到,一個列表裏面,不僅僅只有一種樣式,在這裏展示一種較爲簡易的實現方式,這種實現方式只是在BaseRecyclerViewAdapterHelper的基礎上做簡化,詳細使用可以參考文檔
class MultipleAdapter(var list: MutableList<MultipleItem>) : BaseHxbMultiAdapter<MultipleItem, BaseViewHolder>(list) {
init {
addItemType(MultipleItem.ONE, R.layout.adapter_multiple_01)
addItemType(MultipleItem.TWO, R.layout.adapter_multiple_02)
addItemType(MultipleItem.THREE, R.layout.adapter_multiple_03)
}
override fun convert(holder: BaseViewHolder, item: MultipleItem, position: Int) {
when (item.itemType) {
MultipleItem.ONE -> {
holder.addOnClickListener(R.id.ivEmpty)
.addOnLongClickListener(R.id.ivEmpty)
}
MultipleItem.TWO -> {
}
MultipleItem.THREE -> {
}
}
}
}
然後在Activity中實現也非常簡單;
class MultipleActivity : AppCompatActivity() {
var adapter: MultipleAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recyclerview)
setList()
}
private fun setList() {
// 垂直線性佈局
hrMain.setVerticalLinear()
adapter = MultipleAdapter(setMultiple(3))
hrMain.setAdapter(adapter)
// 開啓純淨模式,所有的刷新佈局都不顯示
hrMain.setPureScrollModeOn()
}
}
仿QQ的側滑彈出刪除
這個功能是應用了EasySwipeMenuLayout,詳細使用可參考文檔,在這裏簡單說一下,其實使用非常簡單,在需要在你列表的item的佈局裏面添加代碼即可;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:clickable="true"
android:orientation="vertical">
<com.guanaj.easyswipemenulibrary.EasySwipeMenuLayout
android:id="@+id/es"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentView="@+id/content"
app:leftMenuView="@+id/left"
app:rightMenuView="@+id/right">
<LinearLayout
android:id="@+id/left"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark"
android:orientation="horizontal"
android:padding="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:text="分享" />
</LinearLayout>
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#cccccc"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="內容區域" />
</LinearLayout>
<LinearLayout
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_red_light"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_bright"
android:clickable="true"
android:padding="20dp"
android:text="刪除" />
<TextView
android:id="@+id/right_menu_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_dark"
android:clickable="true"
android:padding="20dp"
android:text="收藏" />
</LinearLayout>
</com.guanaj.easyswipemenulibrary.EasySwipeMenuLayout>
</LinearLayout>
其他使用
BaseRecyclerViewAdapterHelper這個庫還實現了很多方法,比如說動畫效果、樹狀列表等等,具體使用,請參考官方文檔。
寫在後面的話
非常感謝這些優秀的庫,給我很多啓發以及幫助,有什麼寫得不好或者不懂的,或者其他什麼問題的,歡迎給我反饋。