我有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
对象,并且它们的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
...
}
}
}
}
}
}
}
答案 0 :(得分:1)
我自己解决了。
原因在我的布局xml中。
在recyclerView中,我的item_content_day.xml在所有覆盖的布局中均具有height:match-parent
属性。
当我向下滚动时,我可以看到自己的视图。它在屏幕下方。
如果您遇到与我相同的情况,请检查您的layout.xml