在安卓開(kāi)發(fā)中恒序,隨著業(yè)務(wù)的豐富歧胁,在列表數(shù)據(jù)展示中喊巍,布局多樣式很常見(jiàn)墨榄,如下圖所示:
yhx.gif
第一步:拿到UI頁(yè)面之后不要慌袄秩,分析頁(yè)面有幾種類型展示,拿上圖來(lái)說(shuō)郭卫,一共四種類型背稼。下圖標(biāo)記說(shuō)明:
yhx.png
第二步:上代碼:
class RvAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var liquidates = mutableListOf<DataBean>()
//標(biāo)識(shí)布局類型
companion object {
const val TYPE_ONE = 1
const val TYPE_TWO = 2
const val TYPE_THREE = 3
const val TYPE_FOUR = 4
}
fun setDatas(lists: MutableList<DataBean>) {
this.liquidates = lists
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
TYPE_ONE -> {
OneViewHolder((LayoutInflater.from(parent.context).inflate(R.layout.rv_item_type_one, parent, false)))
}
TYPE_TWO -> {
TwoViewHodler((LayoutInflater.from(parent.context).inflate(R.layout.rv_item_type_two, parent, false)))
}
TYPE_THREE -> {
ThreeViewHolder((LayoutInflater.from(parent.context).inflate(R.layout.rv_item_type_three, parent, false)))
}
else -> {
FourViewHolder((LayoutInflater.from(parent.context).inflate(R.layout.rv_item_type_four, parent, false)))
}
}
}
override fun getItemCount(): Int {
return liquidates.size
}
/**
* 這個(gè)方法重要
* 說(shuō)明 根據(jù)數(shù)據(jù)源中bean中 type標(biāo)識(shí)返回當(dāng)前布局類型
*/
override fun getItemViewType(position: Int): Int {
return when (liquidates[position].type) {
1 -> {
TYPE_ONE
}
2 -> {
TYPE_TWO
}
3 -> {
TYPE_THREE
}
else -> {
TYPE_FOUR
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = liquidates[position]
when (holder.itemViewType) {
TYPE_ONE -> {
val oneViewHolder = holder as OneViewHolder
//設(shè)置數(shù)據(jù)
oneViewHolder.itemView.title.text = item.name
}
TYPE_TWO -> {
val twoViewHodler = holder as TwoViewHodler
//
twoViewHodler.itemView.title.text = item.name
}
TYPE_THREE -> {
val threeViewHolder = holder as ThreeViewHolder
}
else -> {
val fourViewHolder = holder as FourViewHolder
}
}
}
class OneViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
class TwoViewHodler(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
class ThreeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
class FourViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
}
第三步:MainActivity
class MainActivity : AppCompatActivity() {
val rvAdapter by lazy {
RvAdapter()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val gridLayoutManager = GridLayoutManager(this, 4)
gridLayoutManager.spanSizeLookup = mySpanSizeLookup()
Rv.layoutManager = gridLayoutManager
Rv.adapter = rvAdapter
rvAdapter.setDatas(getlistDatas())
}
fun getlistDatas(): MutableList<DataBean> {
val lists = mutableListOf<DataBean>()
lists.add(DataBean("這是標(biāo)題欄1>>>> 表示第一種布局類型", 1))
lists.add(DataBean("這是內(nèi)容2>>>> 表示第二種布局類型", 2))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 3))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是標(biāo)題欄1>>>> 表示第一種布局類型", 1))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是標(biāo)題欄1>>>> 表示第一種布局類型", 1))
lists.add(DataBean("這是內(nèi)容2>>>> 表示第二種布局類型", 2))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 3))
lists.add(DataBean("這是標(biāo)題欄1>>>> 表示第一種布局類型", 1))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是標(biāo)題欄1>>>> 表示第一種布局類型", 1))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
lists.add(DataBean("這是內(nèi)容3>>>> 表示第二種布局類型", 4))
return lists
}
inner class mySpanSizeLookup : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return when (getlistDatas()[position].type) {
//當(dāng)type為1许饿,或4時(shí)舵盈,當(dāng)前item布局所占權(quán)重為4份,也就是一行顯示瓦糟。
//在上面我們?cè)O(shè)置了GridLayoutManager為一行顯示4個(gè)item赴蝇,每個(gè)item所占比為1/4。
1,4 -> {
4
}
//以此類推芍耘,當(dāng)type 2或3時(shí)熄阻,為屏幕的一半。(比重由GridLayoutManager初始值決定)
2,3 -> {
2
}
else -> {
0
}
}
}
}
}