У меня есть 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
...
}
}
}
}
}
}
}