RecyclerView未显示数据

时间:2018-04-12 05:32:20

标签: android android-recyclerview kotlin

我目前正在尝试使用recyclerView创建动态标头。我已经编写了ListAdapter以及ViewHolder。添加了自定义列表元素,列表中元素的数量也是正确的,但不知何故它不显示对象数据,而只显示在layoutdesign中添加的dummyText。

HeaderlistAdapter:

class HeaderListAdapter(val context: Context, val headers: List<CustomHeader>) : RecyclerView.Adapter<HeaderViewHolder>() {


override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): HeaderViewHolder {
    val view = LayoutInflater.from(context).inflate(R.layout.ui_basic_custom_list_element_header, parent, false)
    return HeaderViewHolder(view)
}

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


override fun onBindViewHolder(holder: HeaderViewHolder?, position: Int) {
    holder?.bindHeader(headers[position])
}
fun setFocus(step:UIStep)
{
    for(header in headers)
        header.Active=header.MainContent==step
    notifyDataSetChanged()
  }
}

HeaderViewHolder:

class HeaderViewHolder:RecyclerView.ViewHolder{
@Bind(R.id.ui_adapter_main) var mainText:TextView?=null
@Bind(R.id.ui_adapter_additional) var additionalText:TextView?=null
@Bind(R.id.ui_adapter_layout) var layout:LinearLayout?=null


constructor(itemView: View): super(itemView){
    ButterKnife.bind(this,itemView)
}
fun bindHeader(header:CustomHeader){
    if(header.Active) {
        mainText?.text = header.MainContent.description
        additionalText?.text=header.AdditionalText
        layout?.setBackgroundColor(R.color.colorBackgroundActive.toInt())
    }
    else{
        mainText?.text=header.MainContent.number.toString()
        additionalText?.text=""
        layout?.setBackgroundColor(R.color.colorBackgroundInactive.toInt())
    }
  }
}

以下是listAdapter在视图中的显示方式

<android.support.v7.widget.RecyclerView
        android:id="@+id/ui_basic_lv_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="@color/colorBackgroundInactive"
        android:layout_weight="1" />

下面是自定义元素的xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@color/colorBackgroundInactive"
android:textColor="@color/colorHeaderFont"
android:id="@+id/ui_adapter_layout">
<TextView
    android:id="@+id/ui_adapter_main"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="Main Info"
    android:textSize="36sp"/>
<TextView
    android:id="@+id/ui_adapter_additional"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="additional"
    android:gravity="center_vertical"/>

3 个答案:

答案 0 :(得分:1)

看起来

有问题
@Bind

我在binHeader函数中使用findViewById替换了它:

fun bindHeader(header:CustomHeader){
    val mainText = itemView.findViewById<TextView>(R.id.ui_adapter_main)
    val additionalText = itemView.findViewById<TextView>(R.id.ui_adapter_additional)
    val layout = itemView.findViewById<LinearLayout>(R.id.ui_adapter_layout)
    if(header.Active) {
        mainText?.text = header.MainContent.description
        additionalText?.text=header.AdditionalText
        layout?.setBackgroundColor(R.color.colorBackgroundActive.toInt())
    }
    else{
        mainText?.text=header.MainContent.number.toString()
        additionalText?.text=""
        layout?.setBackgroundColor(R.color.colorBackgroundInactive.toInt())
    }
}

答案 1 :(得分:0)

contentList可以为null,如果contentList为Null,则为'?'之后的方法不会执行。并且在设置适配器后无法调用notifyDataSetChanged;

答案 2 :(得分:0)

您应该为recyclerview设置布局管理器

myRecyclerView.setLayoutManager(linearLayoutManagerVertical);