Recyclerview Adapter中的getItemViewType方法无法正常工作

时间:2020-03-14 07:40:04

标签: android android-recyclerview

我有list_detail,其中包含DataDay,并且DataDetail个对象继承了DetailType抽象类。

list_detail在其零索引中有DataDay个对象,随后的索引中有DataDetail个对象。

如下所示,

abstract class DetailType {
    abstract val type: Int
    companion object {
        val DAY_TYPE = 1
        val DETAIL_TYPE = 2
    }
}

data class DataDay(
    var day: Long? = null
): DetailType() {
    override val type: Int
        get() = DetailType.DAY_TYPE
}

data class DataDetail(
    var moneyUsed: Double? = null,
    var type_used: String? = null
): DetailType() {
    override val type: Int
        get() = DetailType.DETAIL_TYPE
}

问题是,当我使用recyclerview使list_detail按其索引顺序显示时,

它们的viewType在onCreateViewHolderonBindViewHolder处不正确。

list_detail中具有DataDay对象的零索引与其viewType(DAY_TYPE)相匹配。所以这不是问题。

索引大于零(索引1、2、3 ...),列表中的数据应该具有DataDetail对象,并且它们的viewType也应该具有DETAIL_TYPE。但是,它没有t输入onCreateViewHolder()onBindViewHolder() ..传递那些方法,这些方法也不会显示在屏幕上! (不会在logcat上产生任何错误)

下面是我的代码

class ContentActivity : AppCompatActivity(), View.OnClickListener {
    val helper = DBHelper(this)

    var list: MutableList<Long> = mutableListOf()
    var list_detail: MutableList<DetailType> = mutableListOf()

    var selected_day: Long? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_content)

        selectContentDayDB()
        selectMoneyDB()
    }

    fun selectContentDayDB() {
        list = mutableListOf()
        val db = helper.writableDatabase

        val num = intent.getIntExtra("num", 0)
        val cursor = db.rawQuery("select start_day, end_day from t_travel where num=?", arrayOf(num.toString()))

        cursor.moveToNext()
        val start = cursor.getLong(0)
        val end = cursor.getLong(1) + 1000

        for(i in start .. end step 24*60*60*1000) {
            list.add(i)
        }
        recycler.layoutManager = LinearLayoutManager(this)
        recycler.adapter = ContentAdapter(list)
    }

    inner class ContentViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val content_day = view.content_day
        val content_month = view.content_month
    }

    inner class DateViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val content_day_text = view.content_day_text
    }

    inner class DetailViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val content_detail_text = view.content_detail_text
        val content_type_text = view.content_type_text
        val content_image = view.content_image
    }

    inner class ContentAdapter(val list: MutableList<Long>): RecyclerView.Adapter<ContentViewHolder>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentViewHolder {
            val layoutInflater = LayoutInflater.from(parent.context)
            return ContentViewHolder(layoutInflater.inflate(R.layout.item_content, parent, false))
        }

        override fun getItemCount(): Int {
            return list.size
        }

        override fun onBindViewHolder(holder: ContentViewHolder, position: Int) {
            val item = list[position]

            holder.content_day.text = SimpleDateFormat("d").format(item).toString()
            holder.content_month.text = SimpleDateFormat("M").format(item).toString()

            holder.itemView.setOnClickListener {
                list_detail = mutableListOf()
                list_detail.add(DataDay(item))
                selectDetailDB(item)
            }
        }

    }

    fun selectDetailDB(item: Long) {
        val db = helper.writableDatabase
        val num = intent.getIntExtra("num", 0)
        val datecode = SimpleDateFormat("yyMMdd").format(item)
        val isExistSQL = db.rawQuery("select count(*) from t_content where num=? and datecode=?",
            arrayOf(num.toString(), datecode))
        isExistSQL.moveToNext()
        val isExist = isExistSQL.getInt(0)
        if(isExist != 0){
            val cursor = db.rawQuery("select type, moneyUsed from t_content where num=? and datecode=?",
                arrayOf(num.toString(), datecode))

            while(cursor.moveToNext()) {
                val moneyUsed = cursor.getDouble(1)
                val type = cursor.getString(0)

                list_detail.add(DataDetail(moneyUsed, type))  
            }
        }

        recycler_content.layoutManager = LinearLayoutManager(this)
        recycler_content.adapter = DetailAdapter(list_detail)
    }


    inner class DetailAdapter(val list: MutableList<DetailType>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
        override fun getItemViewType(position: Int): Int {
            return list[position].type
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
           when{
                viewType == DetailType.DAY_TYPE -> {
                    val layoutInflater = LayoutInflater.from(parent.context)
                    return DateViewHolder(layoutInflater.inflate(R.layout.item_content_day, parent, false))
                }
                else -> {
                   val layoutInflater = LayoutInflater.from(parent.context)
                   return DetailViewHolder(layoutInflater.inflate(R.layout.item_content_detail, parent, false))
                }
           }
        }

        override fun getItemCount(): Int {
            Log.d("ContentAct: getItem", list.size.toString())
            return list.size
        }

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            val itemType = list[position]

            when(itemType.type){
                DetailType.DAY_TYPE -> {
                    val viewHolder = holder as DateViewHolder
                    val item = itemType as DataDay

                    viewHolder.content_day_text.text = SimpleDateFormat("yyyy MM dd").format(item.day)
                }
                DetailType.DETAIL_TYPE -> {
                    val viewHolder = holder as DetailViewHolder
                    val item = itemType as DataDetail

                    viewHolder.content_detail_text.text = item.moneyUsed.toString()
                    viewHolder.content_type_text.text = item.type_used

                    ...
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我自己解决了。

原因在我的布局xml中。

在recyclerView中,我的item_content_day.xml在所有覆盖的布局中均具有height:match-parent属性。

当我向下滚动时,我可以看到自己的视图。它在屏幕下方。

如果您遇到与我相同的情况,请检查您的layout.xml