HxbRecyclerview,更加簡單易用的Recyclerview

前言

Recyclerview下拉、上拉刷新的第三方庫已經有很多了,用過XRecyclerviewSuperRecyclerview,之前用XRecyclerview的時候,就遇到過在安卓5.0以下的部分手機,會出現不顯示的情況,後來就換了SuperRecyclerview,用了一段時間後,發現在下拉刷新的時候,如果實現list.clear()則會閃退,找了好久沒找到原因。後面就用了其他幾個第三方庫;

  1. BaseRecyclerViewAdapterHelper
  2. EasySwipeMenuLayout
  3. TwinklingRefreshLayout

這三個庫相當的強大,具體使用可以查看上面的傳送門,用這些庫實現一個多功能的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 即可,具體怎樣實現可以參考HxbRefreshViewHxbLoadView,最後別忘了設置

// 自定義下拉刷新佈局
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這個庫還實現了很多方法,比如說動畫效果、樹狀列表等等,具體使用,請參考官方文檔。

寫在後面的話

非常感謝這些優秀的庫,給我很多啓發以及幫助,有什麼寫得不好或者不懂的,或者其他什麼問題的,歡迎給我反饋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章