代码结构:
这一次也是将MVP与JetPack进行了一个融合,这个框架断断续续维护了有大半年,写起逻辑来非常快且清晰,开源看一下示例:
/**
* 展示某个歌手的所有歌曲
*/
class ArtistSongActivity : MusicActivity<ActivityArtistSongBinding>() {
private val songList = arrayListOf<SongBean>()
private lateinit var mAdapter: SongAdapter
private val artistSongPresenter by lazy<ArtistSongActivity, ArtistSongPresenter>()
companion object {
const val KEY_ARTIST_NAME = "key_artist_name"
}
override fun onBindingInflate(): ActivityArtistSongBinding {
return ActivityArtistSongBinding.inflate(layoutInflater)
}
override fun onInit() {
ActivityTools.swipeActivity(this)
val artistName = intent.getStringExtra(KEY_ARTIST_NAME)
binding.tvArtist.text = artistName
//expandClickSpace(binding.ivBack)
binding.ivBack.expandClick(16.0f)
binding.ivBack.setOnClickListener {
onBackPressed()
}
binding.fabPlaying.setSingleClick {
if (PlayManager.currentSong == null) {
ToastUtils.showShort("没有正在播放的歌曲")
return@setSingleClick
}
// 跳转详情
openActivity<MusicDetailActivity>()
}
binding.fabPlaying.setOnLongClickListener {
// 长按暂停或者恢复播放
PlayManager.togglePlay()
true
}
mAdapter = SongAdapter(songList, CurrentListType.ARTIST)
binding.rvArtistSong.run {
layoutManager = LinearLayoutManager(context)
adapter = mAdapter
}
// 设置空View之前必须先绑定RecyclerView
mAdapter.setEmptyView(R.layout.view_empty)
if (!TextUtils.isEmpty(artistName)) {
artistSongPresenter.sortArtistSong(artistName!!)
}
}
fun onSongSorted(currentSongs : List<SongBean>) {
songList.addAll(currentSongs)
mAdapter.notifyDataSetChanged()
}
}
package com.itant.music.main.artist.song
import com.itant.music.main.artist.ArtistManager
import com.itant.music.manager.PlayManager
import com.itant.music.utils.PinyinUtils
import com.miekir.common.widget.loading.LoadingType
import com.miekir.mvp.presenter.BasePresenter
import com.miekir.task.extension.launchTask
import java.util.*
class ArtistSongPresenter : BasePresenter<ArtistSongActivity>() {
fun sortArtistSong(artistName: String) {
launchTask(
{
val currentList = ArtistManager.artistSongMap[artistName]
PlayManager.currentSongList.clear()
if (currentList != null) {
// 按拼音排序
Collections.sort(currentList, kotlin.Comparator {
song1, song2 ->
PinyinUtils.ccs2Pinyin(song1.title)
.compareTo(PinyinUtils.ccs2Pinyin(song2.title), ignoreCase = true)
})
PlayManager.currentSongList.addAll(currentList)
}
PlayManager.currentSongList
}, onResult = {
success, result, code, message ->
if (result != null) {
view?.onSongSorted(result)
}
}, loadingType = LoadingType.INVISIBLE
)
}
}
效果:
源码传送门