5

RecyclerView还在写Adapter?永远抛弃吧(一)

 3 years ago
source link: https://my.oschina.net/u/213420/blog/4877454
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

RecyclerView的用法是什么样子的我就不说了,做安卓的同学都知道,需要写adapter,然后在adapter中写布局文件,虽然有第三方的框架可以大大减少代码量,但是还是存在一些问题。我在想RecyclerView能不能像TextView那样直接setText("xxx")一样使用呢?答案是肯定的,今天给大家介绍一款框架名叫CHGAdapter的Android版本。这里主要介绍Android的kotlin版。

话不多说,现在开始介绍具体使用方法。

  • 显示简单的列表

首先创建一个模型:MenuItemModel

因为我们这里要实现类似TextView那种setText的方式来使用RecyclerView,因此我们需要告诉RecyclerView的内容有两点

1.数据对象使用哪一个布局文件。2.数据对象使用哪一个ViewHolder。那么我们需要模型实现接口

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类:SongViewHolder

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。

我们这里再创建一个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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK