kotlin данные об утилизации не отображаются - PullRequest
0 голосов
/ 10 октября 2018

Наш вопрос заключается в том, как отобразить данные Parent и Child из двух таблиц БД SQLite?

У нас есть две таблицы, которые добавляются в два ArrayLists childList и parentList.

Здеськласс модели для каждой

class ModelParent {
    var idD:Int = 0
    var dept:String = ""
    var fkD:Int = 0
    var children: List<ModelChild> = mutableListOf()
    //var children: ArrayList<ModelChild>? = null
    //var children: List<ModelChild>  by Delegates.notNull()
    constructor (children: List<ModelParent>) : this()
    companion object {
       var globalVar = 1
   }
}

class ModelChild {
    var idI:Int = 0
    var item:String = ""
    var fkI:Int = 0
}

У нас есть два адаптера для каждой таблицы, и мы опубликуем этот кодМы можем перебрать два ArrayList с этим кодом и отобразить данные в формате, который мы хотели бы показать в ViewActivity.

fun theGET(){
    val db = DBHelper(this)
    childList = db.queryITEM()
    parentList = db.queryDEPT()
    var PL = parentList.size

    do {
        var DEPT: String = parentList[z].dept
        var PARENT_LIST_FK = parentList.get(z).fkD
            println("========== Dept " + DEPT + " fkD " + PARENT_LIST_FK)
        val FK = PARENT_LIST_FK
        childList = db.queryALL(FK)
        var CL = childList.size
        for (a in 0..CL - 1) {
            var CHILD_ITEM = childList[a].item
            var CHILD_LIST_FK = childList[a].fkI
            println("========== item " + CHILD_ITEM+" fkI "+CHILD_LIST_FK)
        }
        z++
    }
    while (z <= PL-1)
}

Мы опубликуем View Activity

class ViewActivity : AppCompatActivity() {
    lateinit var recyclerView: RecyclerView

    private var parentList:List<ModelParent> = ArrayList()
    private var childList:List<ModelChild> = ArrayList()

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

        initRecycler()

    }// end onCreate

    private fun initRecycler() {
        val db = DBHelper(this)
        childList = db.queryITEM()
        parentList = db.queryDEPT()

        recyclerView = rv_parent

        recyclerView.apply{
            layoutManager = LinearLayoutManager(this@ViewActivity, LinearLayout.VERTICAL, false)
            adapter = ViewAdapter(parentList)
            adapter = ViewChildAdapter(children = childList)
        }
    }
}

ViewActivity имеет этот XML-файл

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_parent"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>

Два адаптера и соответствующие ему XML-файлы

class ViewAdapter(private val parents:List<ModelParent>):RecyclerView.Adapter<ViewAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.the_view,parent,false)
        return ViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val parent = parents[position]
        holder.textView.text = parent.dept
        holder.recyclerView.apply {
            layoutManager = LinearLayoutManager(holder.recyclerView.context, LinearLayout.VERTICAL, false) as RecyclerView.LayoutManager?
            adapter = ViewChildAdapter(parent.children!!)
        }
    }

    inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
        val recyclerView : RecyclerView = itemView.rv_child
        val textView: TextView = itemView.textView
    }
}
class ViewChildAdapter(private val children:List<ModelChild>):RecyclerView.Adapter<ViewChildAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.child_recycler,parent,false)
        return ViewHolder(view)
    }
    override fun getItemCount(): Int {
        return children.size
    }
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val child = children[position]
        holder.textView.text = child.item
    }

    inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
        val textView : TextView = itemView.child_textView
    }
}

Завышенные XML-файлы

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="2dp"
    card_view:cardBackgroundColor="#fff"
    card_view:cardCornerRadius="5dp"
    card_view:cardElevation="4dp"
    card_view:cardUseCompatPadding="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            style="@style/Base.TextAppearance.AppCompat.Subhead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/rv_child"
            android:layout_alignParentTop="true"
            android:padding="20dp"
            android:background="@color/color_super_lightGray"
            android:text="Dept Header"
            android:textColor="@color/color_Purple"
            android:textSize="24sp"
            android:textStyle="bold" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_child"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true"
            android:layout_marginTop="70dp"
            android:layout_marginBottom="0dp"
            android:orientation="horizontal"
            android:paddingLeft="4dp"
            android:paddingTop="8dp"
            tools:layout_editor_absoluteX="74dp" />
    </RelativeLayout>
</android.support.v7.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/child_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/color_Transparent"
        android:padding="10dp"
        android:text="TextView"
        android:textColor="@color/color_Black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

Когда загружен ViewActivity, ТОЛЬКО дочерний список отображается.

Мы пробовали различные изменения и не можем отобразить parent List, хотя с помощью theGETзабавные данные parentList отображаются, поэтому мы знаем, что они есть в списке.

Мы можем запустить забавный theGET и создать новый ArrayList, который кажется бесполезным.

Наша заботаявляется то, что parentList отображается, а затем удаляется при отображении childList.

Мы не знаем, как это доказать.

Поэтому наш вопрос, как показать, Родитель и ребенокорганизованно данные в View Activity?

Мы добавляем Новый КОД на основе ответа @CrucesНекоторые проблемы с этим кодом находятся за пределами нашего понимания1. У нас нет возможности запустить забавное объединение, чтобы создать новый список2. Parent и Child ViewHolder могут быть вызваны только с получателем содержащего класса3. Слишком много внутренних классов, и нужна ли нам аннотация внешнего вложенного?4. or if both parent and child implement an interface a List< IItem > )Мы не знаем, как написать интерфейс и подключить его к JoinAdapter

Хотя ответ ставит новый вопрос, мы чувствуем, что лучше задать его в этом контексте = Контекст ЮМОР Вот ИСПРАВЛЕНИЕ для JoinAdapter

class JoinAdapter(internal var context: Context, val parents: List<ModelParent>) : RecyclerView.Adapter<JoinAdapter.MyViewHolder>() {
val items = mutableListOf<Any>()

init {
    parents //parents should be passed as a constructor argument
            .forEach {
                items.add(it)
                items.addAll(it.children)
            }
}

override fun getItemCount(): Int = items.size;


fun getItem(position: Int): Any = items[position]

override fun getItemViewType(position: Int): Int = if (getItem(position) is ModelParent) 0 else 1

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    var view: View? = null
    if (viewType == 0) {
        view = LayoutInflater.from(parent.context).inflate(R.layout.the_view, parent, false)
        return ParentViewHolder(view!!)
    } else {
        view = LayoutInflater.from(parent.context).inflate(R.layout.child_recycler, parent, false)
        return ChildViewHolder(view!!)
    }
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) = holder.bindData(position, getItem(position))

inner abstract class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    abstract fun bindData(position: Int, item: Any)

}

inner class ParentViewHolder(view: View) : MyViewHolder(view) {
    override fun bindData(position: Int, item: Any) {
        val parent = item as? ModelParent ?: return
        parent.dept
        parent.fkD
        parent.children
        //bind the data here
    }

    init {
        val textView: TextView = view.textView
        var editCLICK: RelativeLayout = view.findViewById(R.id.editCLICK) as RelativeLayout
        //do the view setup here
    }

}

inner class ChildViewHolder(view: View) : MyViewHolder(view) {
    init {
        val textView : TextView = itemView.child_textView
        //do the view setup here
    }

    override fun bindData(position: Int, item: Any) {
        val child = item as? ModelChild ?: return
        child.item
        child.idI
        //bind the data here
    }
}

Я собираюсь опубликоватьПросмотр активности вызов присоединиться адаптер Код не терпит неудачу, он просто ничего не показывает?

        RecyclerAdapter1 = JoinAdapter(parents = ArrayList(),context = applicationContext)
    (recyclerView as RecyclerView).adapter = RecyclerAdapter1

Вот ViewJoinActivity, он будет загружать родительские данные, NO дочерние данные

class ViewJoinActivity : AppCompatActivity() {

lateinit var recyclerView: RecyclerView
private var RecyclerAdapter: JoinAdapter? = null
private var linearLayoutManager: LinearLayoutManager? = null
private val db = DBHelper(this)
private var parentList:List<ModelParent> = ArrayList()
private var childList:List<ModelChild> = ArrayList()

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

}// end onCreate

override fun onResume() {
    super.onResume()
    initDB()
}

private fun initDB() {
    parentList = db.queryDEPT()
    //childList = db.queryCHILD(1)
    childList = db.queryITEM()
    // queryCHILD only selects records with a fkI equal to idD
    // SEE THE ModelChild and ModelParent
    if(parentList.isEmpty()){
        title = "No Records in DB"
    }else{
        title = "Parent List"
    }

        RecyclerAdapter = JoinAdapter(parents = parentList, context = applicationContext)
        (recyclerView as RecyclerView).adapter = RecyclerAdapter
    }

private fun initRecycler() {
    val db = DBHelper(this)
    childList = db.queryITEM()
    parentList = db.queryDEPT()

    //recyclerView = rv_parent

    /*var PL = parentList.size
    newList.clear()
    do {
        var DEPT: String = parentList[z].dept
        var ND:String = DEPT
        var PARENT_LIST_FK = parentList.get(z).fkD
        var PL_ST = ND+" "+PARENT_LIST_FK
        newList.add(PL_ST)

        println("========== Dept " + DEPT + " fkD " + PARENT_LIST_FK)
        val FK = PARENT_LIST_FK

        childList = db.queryCHILD(FK)
        var CL = childList.size

        for (a in 0..CL - 1) {
            var CHILD_ITEM = childList[a].item
            var NI:String = childList[a].item
            var CHILD_LIST_FK = childList[a].fkI
            var IL_ST = NI+" "+CHILD_LIST_FK
            newList.add(IL_ST)
            println("========== item " + CHILD_ITEM+" fkI "+CHILD_LIST_FK)
        }
        z++

        g++
    }
    while (z <= PL-1)


    var ui = newList.size
    g=0
    for(g in 0..ui-1){
        var N2 = newList[g]

        if(N2.toString().contains("1")){
            println("********************** We Found "+N2)

        }
        println("############### BOTH = "+N2)

    }*/

    recyclerView = this.findViewById(R.id.rv_parent)
    RecyclerAdapter = JoinAdapter(parents = parentList, context = applicationContext)
    linearLayoutManager = LinearLayoutManager(applicationContext)
    (recyclerView as RecyclerView).layoutManager = linearLayoutManager!!

    //recyclerView.apply {
        //layoutManager = LinearLayoutManager(this@ViewJoinActivity, LinearLayout.VERTICAL, false)
        //adapter = JoinAdapter(children = childList)
    //}

}

}

Проблема в вызове адаптера соединения из действия??С этим действием связан файл XML, связанный с RecyclerView rv_parent

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Вот ответ и некоторые замечания по поводу дизайна этого приложенияОтвет НЕ помещает родительские и дочерние данные в один и тот же список просмотра Recycler.Но ответ может помочь решить проблему с дальнейшими исследованиями!Мы создали родительский список, и при щелчке по родительскому отделу отобразятся соответствующие дочерние элементы.Это может быть более функциональный дизайн при совершении покупок, вам нужно только взглянуть на товары в этом разделе.Это означает, что нужно меньше прокручивать единый список родителей и детей.

Несколько слов о дизайне, который, как мы предполагаем, в продуктовом магазине могут иметь 20 или более отделов (родителей), так как вы планируете узнать, какие элементы (дочерние данные) связаны с соответствующим отделом (родительским)?радикальный редизайн при построении этих двух списков.

Если вы загрузили код с GitHub, вы лучше поймете этот недостаток дизайна

Вот весь код с файлами XML

Основная активность переходит к просмотру активности

    fun onViewAll(view: View){
    val intent = Intent(this,ViewActivity::class.java)
    intent.putExtra("pickADAPTER",2)
    startActivity(intent)
}

Вот просмотр активности

class ViewActivity : AppCompatActivity() {

lateinit var recyclerView: RecyclerView

private var RecyclerAdapter1: ViewAdapter? = null
private var RecyclerAdapter2: ViewChildAdapter? = null
private var linearLayoutManager: LinearLayoutManager? = null

private val db = DBHelper(this)

private var parentList:List<ModelParent> = ArrayList()
private var childList:List<ModelChild> = ArrayList()

var idD = 0
var whichADAPTER = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_view)
    val bundle: Bundle = intent.extras
    idD = bundle.getInt("BIGi", 0)
    whichADAPTER = bundle.getInt("pickADAPTER",0)

    initRecycler()

}// end onCreate

override fun onResume() {
    super.onResume()
    initDB()
}

private fun initDB() {
    parentList = db.queryDEPT()
    childList = db.queryCHILD(idD)
    // queryCHILD only selects records with a fkI equal to idD
    // SEE THE ModelChild and ModelParent
    if(parentList.isEmpty()){
        title = "No Records in DB"
    }else{
        title = "Parent List"
    }

    if(whichADAPTER == 2) {
        RecyclerAdapter1 = ViewAdapter(parents = parentList, context = applicationContext)
        (recyclerView as RecyclerView).adapter = RecyclerAdapter1
    }else{
        RecyclerAdapter2 = ViewChildAdapter(children = childList)
        (recyclerView as RecyclerView).adapter = RecyclerAdapter2
    }
}

private fun initRecycler() {
    val db = DBHelper(this)
    childList = db.queryITEM()
    parentList = db.queryDEPT()

    recyclerView = rv_parent

    recyclerView = this.findViewById(R.id.rv_parent)
    RecyclerAdapter1 = ViewAdapter(parents = parentList, context = applicationContext)
    linearLayoutManager = LinearLayoutManager(applicationContext)
    (recyclerView as RecyclerView).layoutManager = linearLayoutManager!!

}

Здесь XML-файл для просмотра действий

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_parent"
android:layout_width="match_parent"
android:layout_height="match_parent" />

Адаптер вида

class ViewAdapter(private val parents: List<ModelParent>, internal var context: Context):RecyclerView.Adapter<ViewAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.the_view,parent,false)
    return ViewHolder(view)
}

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

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val parent = parents[position]
    holder.textView.text = parent.dept

    holder.editCLICK.setOnClickListener {
        val i = Intent(context, ViewActivity::class.java)
        i.putExtra("BIGi",parent.idD)
        i.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(i)
    }
}

inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
    //val recyclerView : RecyclerView = itemView.rv_child
    val textView: TextView = itemView.textView
    var editCLICK: RelativeLayout = itemView.findViewById(R.id.editCLICK) as 
    RelativeLayout

и раздутый XML

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="2dp"
card_view:cardBackgroundColor="#FF0000"
card_view:cardCornerRadius="5dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true">

<RelativeLayout
    android:id="@+id/editCLICK"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        style="@style/Base.TextAppearance.AppCompat.Subhead"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/rv_child"
        android:layout_alignParentTop="true"
        android:padding="10dp"
        android:background="@color/color_lightGray"
        android:text="Dept Header"
        android:textColor="@color/color_Purple"
        android:textSize="24sp"
        android:textStyle="bold" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_child"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="50dp"
        android:layout_marginBottom="0dp"
        android:orientation="horizontal"
        android:paddingLeft="4dp"
        android:paddingTop="6dp"
        tools:layout_editor_absoluteX="74dp" />

</RelativeLayout>

Это процедура поиска в DBHelper

    fun queryCHILD(fkI: Int): List<ModelChild> {
    val db = this.writableDatabase
    val childList = ArrayList<ModelChild>()
    val selectQuery = "SELECT  * FROM $CHILD_TABLE WHERE $colCFK = ?"
    val cursor = db.rawQuery(selectQuery, arrayOf(fkI.toString()))
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                val contact = ModelChild()
                contact.idI = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colidI)))
                contact.item = cursor.getString(cursor.getColumnIndex(colItem))
                contact.fkI = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colCFK)))
                childList.add(contact)
            } while (cursor.moveToNext())
        }
    }
    cursor.close()
    return childList
}

Стоит отметить, что мы прикрепили OnClickListener к относительной компоновке.

 holder.editCLICK.setOnClickListener

Почему мы не уверены, что вы можете получить информацию типа parent.idD из RecyclerView, установленного в качестве прослушивателя?Мы должны исследовать это, но в нашем тестировании код не удался, когда мы пытались.

0 голосов
/ 17 октября 2018

То, как я это сделаю, это сгладить список edit: like this in the constructor

val items : MutableList<Any> = mutableListOf<Any>()    

init() {
   parents //parents should be passed as a constructor argument
         .asSequence() //this is only needed if you want to also order them
         .sortedBy { it.idD } //again only if you want to sort them
         .forEach { 
              items.add(it)
              items.addAll(it.children)
          }
}

Я бы создал список (или если родительский и дочерний элементы реализуют интерфейс List ), которыйбудет содержать все данные, которые вы хотите видеть, так что, например, это может выглядеть так:

val items : List<Any> = listOf(parent1, child11,child12,child13,parent2,child12,child13,child14.....etc)

, тогда я бы реализовал один адаптер с несколькими типами представлений, например так:

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

fun getItem(position: Int) : Any { //or the interface 
    return items[position]
}

override getItemViewType (position: Int) : Int {
    if (getItem(position) is ModelParent)
        return 0
    return 1
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    var view : View? = null
    if (viewType == 0) {
        view = LayoutInflater.from(parent.context).inflate(R.layout.parent_layout,parent,false)
        return ParentViewHolder(view);
    } else {
       view = LayoutInflater.from(parent.context).inflate(R.layout.child_layout,parent,false)
        return ChildViewHolder(view);
    }
}

и затем я бы использовал два держателя представления, чтобы представить, как данные отображаются для конкретного элемента

 inner class ParentViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){ ...}
 inner class ChildViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){ ...}

, после этого я мог бы выполнять различные привязки, получая тип представления, что-то вроде этого:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    if (getItemType(position) == 0) {
        (holder as ParentViewHolder).bindData(....)
    } else {
        (holder as ChildViewHolder).bindData(....)
    }
}

edit: вот полный адаптер, который я построил, он основан на двух файлах макета:

list_item_child:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="2dp"
    card_view:cardBackgroundColor="#fff"
    card_view:cardCornerRadius="5dp"
    card_view:cardElevation="4dp"
    card_view:cardUseCompatPadding="true">

    <TextView
        android:id="@+id/child_item"
        style="@style/Base.TextAppearance.AppCompat.Display3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:padding="20dp"
        android:textSize="24sp"
        android:textStyle="bold"
        tools:text="Dept Header" />

</android.support.v7.widget.CardView>

list_item_parent:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="2dp"
    card_view:cardBackgroundColor="#fff"
    card_view:cardCornerRadius="5dp"
    card_view:cardElevation="4dp"
    card_view:cardUseCompatPadding="true">

    <TextView
        android:id="@+id/parent_department"
        style="@style/Base.TextAppearance.AppCompat.Headline"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:padding="20dp"
        tools:text="Dept Header"
        android:textSize="24sp"
        android:textStyle="bold" />

</android.support.v7.widget.CardView>

и адаптер будет выглядеть примерно так:

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView

data class ModelParent(val id: Int, val children: List<ModelChild>)
data class ModelChild(val id: Int)


class JoinAdapter(internal var context: Context, val parents: List<ModelParent>) : RecyclerView.Adapter<JoinAdapter.MyViewHolder>() {
    val items = mutableListOf<Any>()

    init {
        parents //parents should be passed as a constructor argument
                .forEach {
                    items.add(it)
                    items.addAll(it.children)
                }
    }

    override fun getItemCount(): Int = items.size;


    fun getItem(position: Int): Any = items[position]

    override fun getItemViewType(position: Int): Int = if (getItem(position) is ModelParent) 0 else 1

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        var view: View? = null
        if (viewType == 0) {
            view = LayoutInflater.from(parent.context).inflate(R.layout.rv_list_item_parent, parent, false)
            return ParentViewHolder(view!!)
        } else {
            view = LayoutInflater.from(parent.context).inflate(R.layout.rv_list_item_child, parent, false)
            return ChildViewHolder(view!!)
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) = holder.bindData(position, getItem(position))

    inner abstract class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        abstract fun bindData(position: Int, item: Any)

    }

    inner class ParentViewHolder(view: View) : MyViewHolder(view) {
        var parentDept: TextView = view.findViewById(R.id.parent_department) as TextView

        override fun bindData(position: Int, item: Any) {
            val parent = item as? ModelParent ?: return
            parentDept.text = parent.dept
        }
    }

    inner class ChildViewHolder(view: View) : MyViewHolder(view) {
        var childItem: TextView = view.findViewById(R.id.child_item) as TextView

        override fun bindData(position: Int, item: Any) {
            val child = item as? ModelChild ?: return
            childItem.text = child.item
        }
    }

}

это при использовании в одном окне повторного просмотра все дети, находящиеся под своим родителем, будут отображаться в списке

0 голосов
/ 14 октября 2018

В классе ViewActivity вы сначала задали для адаптера recyclerView значение ViewAdapter, а затем ViewChildAdapter, таким образом, теперь адаптер recyclerView равен ViewChildAdapter вместо ViewAdapter.Удалите эту строку, и проблема будет решена.

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