Метод getItemViewType в адаптере Recyclerview работает неправильно - PullRequest
0 голосов
/ 14 марта 2020

У меня есть 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 не делает не совпадают правильно в onCreateViewHolder и onBindViewHolder.

Нулевой индекс в list_detail, для которого объект DataDay соответствует его viewType (DAY_TYPE). Так что это не проблема.

Индекс над нулем (индекс 1, 2, 3 ...), его данные в списке должны иметь DataDetail Object, и их viewType также должен иметь DETAIL_TYPE Я думаю. НО, это не вводит 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 голосов
/ 15 марта 2020

Я решил это сам.

Причина в моем макете xml.

Мой item_content_day. xml в recyclerView имеет свойство height: match-parent во всем покрытом макете .

Я вижу свой вид, когда прокручиваю вниз. Он был ниже экрана.

Если у вас такая же ситуация, как у меня, пожалуйста, проверьте layout.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...