Android客户端简易版抖音开发 | 青训营笔记

128 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的第5天。主要讲述我在青训营大项目中的工作。

我们的项目采用Kotlin语言, 网络请求库采用okhttp
数据库存储使用room
项目框架采用mvvm
数据从抖音开放平台获取

目录结构

image.png

image.png

image.png

image.png

image.png

然后我写的页面就是电视剧榜单以及粉丝和关注的人列表。这两个事情其实差不多,都是需要请求网络,存到数据库里,然后页面写activity和fragment和adapter并bind起来,页面用到recyclerview。

在组队的过程中,遇到了很好的队友,不仅经验很丰富,在我有问题的时候还都很热心地回答,帮我解决问题,真的备受鼓舞,从他们身上学到很多。

例子
image.png
实现
ab8db80d6699d135a47bba055ae8187.jpg

//粉丝
//用户关注的人
@GET(AcUrl.fans)
@Headers("Content-Type:application/json")
suspend fun discoveryFansList(
  @Query("open_id") openId: String,
  @Query("count") count: Int,
  @Query("cursor") cursor: Int,
): ApiResponse<FollowerResp>

RecyclerView的每个元素用到这个类。

com.google.android.material.card.MaterialCardView

RankAdapter类.

class RankAdapter : BindingListAdapter<RankItem, RankAdapter.RankViewHolder>(diffUtil) {

  private var onClickedAt = 0L

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankViewHolder =
    parent.binding<ItemRankBinding>(R.layout.item_rank).let(::RankViewHolder)

  override fun onBindViewHolder(holder: RankViewHolder, position: Int) =
    holder.bindPokemon(getItem(position))

  inner class RankViewHolder constructor(
    private val binding: ItemRankBinding
  ) : RecyclerView.ViewHolder(binding.root) {

    init {
      binding.root.setOnClickListener {
        val position = bindingAdapterPosition.takeIf { it != NO_POSITION }
          ?: return@setOnClickListener
        val currentClickedAt = SystemClock.elapsedRealtime()
        if (currentClickedAt - onClickedAt > binding.transformationLayout.duration) {
//          DetailActivity.startActivity(binding.transformationLayout, getItem(position))
//          onClickedAt = currentClickedAt
        }
      }
    }

    fun bindPokemon(rankItem: RankItem) {
      binding.item = rankItem
      binding.executePendingBindings()
    }
  }

  companion object {
    private val diffUtil = object : DiffUtil.ItemCallback<RankItem>() {

      override fun areItemsTheSame(oldItem: RankItem, newItem: RankItem): Boolean =
        oldItem.name == newItem.name

      override fun areContentsTheSame(oldItem: RankItem, newItem: RankItem): Boolean =
        oldItem == newItem
    }
  }
}