Android Studio Kotlin Recyclerview如何为特定对象功能做多类型视图?



我有来自RickandMorty Api的数据,并将它们保存在CharacterList上,我在recyclerview中显示它们。我有名字,位置和状态信息,并显示在卡片上。我有显示死亡用户的另一个卡项,我想在另一个卡项中显示默认卡和死亡人员中的活着的人(默认卡项具有蓝色背景色和其他卡项具有红色背景色)。所以作为我的研究人们用getItemViewType()处理,但在我的情况下,我想分类他们每个对象的状态类型是活的或死的。我该怎么做呢?

这是我的主活动类

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(CharacterViewModel::class.java)
CoroutineScope(Dispatchers.IO).launch {
viewModel.getData()
}
viewModel.users.observe(this, Observer { characterList ->
for (i in characterList.results){
Log.e(TAG, "${i.name}")
name_list.add(i.name)
}
recyclerview1.layoutManager = LinearLayoutManager(this)
recyclerview1.adapter = Adapter(characterList.results)

})

}}

这是我的ViewHolder类

class ViewHolder (container: ViewGroup) : RecyclerView.ViewHolder(
//xml deki verilere bakarak arayüz viewvi oluşturuyor
LayoutInflater.from(container.context).inflate
(
R.layout.carditem,
container,
false
)
) {
val crdView: CardView = itemView.findViewById(R.id.cardview1)
val profileLink: ImageView = itemView.findViewById(R.id.imgProfilePhoto)
val txtname: TextView = itemView.findViewById(R.id.name)
val txtlocation: TextView = itemView.findViewById(R.id.location)
val txtstatus: TextView = itemView.findViewById(R.id.status)

fun bind(characteritem: Result) {
txtname.text = characteritem.name
profileLink.load(characteritem.image)
txtlocation.text = characteritem.location.name
txtstatus.text=characteritem.status
}
}

和适配器类

class Adapter(val CharacterList: List<Result>):RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(parent)
}
override fun getItemCount(): Int {
return CharacterList.size
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
holder.bind(CharacterList[position])
}

}

这是我所做的

我想做的是

The view of Cards

如果你的不同布局有相同的资源,只是不同的外观,你可以只传递一个备用布局ID给你的视图持有人,像这样:

class Adapter(val CharacterList: List<Result>):RecyclerView.Adapter<ViewHolder>() {
override fun getItemViewType(position: Int): Int {
return if (CharacterList[position].status == "Dead") 0 else 1
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layout = if(viewType == 0) R.layout.card_dead else R.layout.card_alive
return ViewHolder(parent, layout)
}
override fun getItemCount(): Int {
return CharacterList.size
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
holder.bind(CharacterList[position])
}
}

然后修改视图holder,将布局ID作为构造函数的输入:

class ViewHolder (container: ViewGroup, layout: Int) : RecyclerView.ViewHolder(
LayoutInflater.from(container.context).inflate
(
layout,
container,
false
)
) 
{
//...
}

或者你可以使用单一的布局,并在bind

中以编程方式更改背景颜色。

在您的适配器中,像这样覆盖getItemViewType

@Override
fun getItemViewType(position:Integer):Integer {
return if (CharacterList[position].isDead) 0 else 1
}

然后在onCreateViewHolder中检查viewType,以了解您是否需要创建一个"活"或"死"的视图。

相关内容

  • 没有找到相关文章

最新更新