RecyclerView還在寫Adapter?永遠拋棄吧(一)

RecyclerView的用法是什麼樣子的我就不說了,作安卓的同窗都知道,須要寫adapter,而後在adapter中寫佈局文件,雖然有第三方的框架能夠大大減小代碼量,可是仍是存在一些問題。我在想RecyclerView能不能像TextView那樣直接setText("xxx")同樣使用呢?答案是確定的,今天給你們介紹一款框架名叫CHGAdapter的Android版本。這裏主要介紹Android的kotlin版。java

話很少說,如今開始介紹具體使用方法。

  • 顯示簡單的列表

首先建立一個模型:MenuItemModelandroid

由於咱們這裏要實現相似TextView那種setText的方式來使用RecyclerView,所以咱們須要告訴RecyclerView的內容有兩點git

1.數據對象使用哪個佈局文件。2.數據對象使用哪個ViewHolder。那麼咱們須要模型實現接口github

com.chg.adapter.Model算法

open class SongModel : Model {

    var iconName:Int = 0
    var name:String? = null
    var songer:String? = null

    constructor(iconName: Int, name: String?, songer: String?) {
        this.iconName = iconName
        this.name = name
        this.songer = songer
    }


    override fun getResource(position: Int): Int {
        return R.layout.song_item
    }

    override fun getHolderClass(position: Int): Class<*> {
        return SongViewHolder::class.java
    }
}

接下來是咱們的ViewHolder類:SongViewHolderswift

class SongViewHolder(
    itemView: View,
    eventTransmissionListener: EventTransmissionListener?,
    parent: ViewGroup?
) : ViewHolder<SongModel>(itemView, eventTransmissionListener, parent) {

    private var mImageView:ImageView? = null
    private var mNameTextView:TextView? = null
    private var mSongerTextView:TextView? = null

    override fun onCreated() {
        mImageView = findViewById(R.id.imageView)
        mNameTextView = findViewById(R.id.name)
        mSongerTextView = findViewById(R.id.songer)
    }

    override fun onBindViewHolder(model: SongModel?) {
        super.onBindViewHolder(model)
        model?.iconName?.let { mImageView?.setImageResource(it) }
        mNameTextView?.text = model?.name
        mSongerTextView?.text = model?.songer
    }
}

接下來是寫咱們的SongActivity中的代碼。佈局文件中放一個RecyclerView,而後activity中的代碼以下。數組

class SongActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recyclerView = findViewById(R.id.recyclerView)
        //設置數據
        recyclerView.models = getModels()
    }

    fun getModels(): List<Model> {
        var models = mutableListOf<SongModel>()
        for (index in 1..1000) {
            models.add(SongModel(R.drawable.music,"歌曲名稱:$index","歌手名字:$index"))
        }
        return models
    }

}

運行一下看看效果框架

  • 顯示多種類型的數據

說明:這裏爲了讓每一個demo看起來清晰,所以每個demo都單首創建一個Activity。ide

咱們這裏再建立一個Model命名爲AlbumModel。代碼以下佈局

open class AlbumModel : Model {
     var name: String? = null
     var songer: String? = null

    constructor(name: String?, songer: String?) {
        this.name = name
        this.songer = songer
    }

    override fun getResource(position: Int): Int {
        return R.layout.album_item
    }

    override fun getHolderClass(position: Int): Class<*> {
        return AlbumViewHolder::class.java
    }
}

而後建立咱們的activity命名爲RecommendActivity。代碼以下

class RecommendActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recyclerView = findViewById(R.id.recyclerView)
        //設置數據
        recyclerView.models = getModels()
    }

    fun getModels(): List<Model> {
        var models = mutableListOf<Model>()
        for (i in 0..99) {
            if (i % 2 == 0) {
                models.add(SongModel(R.drawable.music,"歌曲名稱:$i","歌手名字:$i"))
            } else {
                models.add(AlbumModel("專輯名稱:$i", "歌手"))
            }
        }
        return models
    }
}

這裏咱們交替顯示2中不一樣類型的數據。所以建立數組的時候經過對2取莫的算法來構造數據,運行效果以下

能夠看到咱們在增長RecyclerView中的數據只是建立了一個模型設置好佈局文件和ViewHolder後將模型數據放入List中後RecyclerView就能按照預期的方式顯示出來。這樣之後咱們只須要往數組中添加新的數據類型RecyclerView就會按照數組中的數據順序顯示對應的ItemViw。

因爲篇幅的問題,先簡單介紹到這裏。更多介紹能夠下載demo,或者關注後續文章。或者加入QQ羣討論交流

Android(CHGAdapter)

Ios(CHGAdapter)

HarmonyOS(UltimateProvider)

若有使用方面的問題或者交流請加QQ羣:494648687

相關文章
相關標籤/搜索