kotlin один адаптер для просмотра двух таблиц - PullRequest
0 голосов
/ 04 октября 2018

Для решения нашей проблемы у нас есть 3 проблемы (вопросы)И 3 возможных решенияПОЧЕМУ, потому что нам кажется, что для решения проблемы, как представляется, возможно несколько способов решения проблем.И каждый зависит от различных связанных конструкций

Мы работаем с Kotlin и SQLite DB с двумя таблицами Parent и ChildДанные в этих таблицах имеют стандартную функцию CRUD, которую мы называем Back-End.Мы написали Enter Activity, View Activity и Адаптеры для каждой родительской и дочерней таблицы.

Наша цель - просмотреть данные в двух таблицах следующим образом

ПРОДУКТпомидорыavacodosЛикерпиво

Вот классы Model для каждой таблицы.Вы заметите неправильно разработанный внешний ключ с этими моделями

 class ModelParent {

 var idD:Int = 0
 var dept:String = ""
 var fkD:Int = 0
 val children : List<ModelChild>? = null

}

class ModelChild {

var idI:Int = 0
var item:String = ""
var fkI:Int = 0

}

В ModelParent мы рассмотрели попытку связать ModelChild с ParentModel и выполнитьэто с псевдокодом, подобным этому

       holder.recyclerView.apply {
        layoutManager = LinearLayoutManager(holder.recyclerView.context, LinearLayout.HORIZONTAL, false)
        adapter = ChildAdapter(parent.children)
        recycledViewPool = viewPool
    }

Что становится неясным с этой концепцией, так этоКак построить представление в Деятельности, которое отображает данные, как наша цель?

Это подводит нас к использованию наших внешних ключей.Мы подумали о коде, который будет проверять родительские данные fkD, и если дочерние данные fkI будут равны друг другу, тогда дочерние данные будут добавлены в первый виджет просмотра карты в RecyclerView, и когда они больше не будут совпадать, будут добавлены следующие родительские данные.на второй вид карты

Для нашего следующего решения этой проблемы мы рассмотрели создание UNION ALL для двух таблиц и создание новой таблицы.Мы проверили это с DBBrowser и вот код и результаты

create table NewAll as
select Dept,fkD from Parent
union all
select Item,fkI from Child

"PRODUCE"   "1"
"LIQUOR"    "2"
"tomatoes"  "1"
"avacodos"  "1"
"beer"      "2"

Поскольку эта новая таблица создается на лету, наши вопросыЕсли мы создадим для этого модель до того, как она будет создана, как с этим справится привязка в адаптере?Как написать два цикла, которые будут управлять загрузкой одного родителя, а затем связанных потомков перед загрузкой следующего родителя?

И последний, но не менее важный, наш псевдокод в БД, который мы позаимствовали из другого источника проекта.У нас нет полного понимания того, как работает этот код, br />

    fun getDepartments(): List<ParentModel>{
    val cursor = writableDatabase.query(DEPARTMENTS, arrayOf(ID, TITLE), null, null,
            null, null, ID)
    val list = mutableListOf<ParentModel>()
    if (cursor != null) {
        cursor.moveToFirst()
        while (!cursor.isAfterLast){
            val departmentId = cursor.getLong(cursor.getColumnIndex(ID))
            val items = getItems(departmentId)
            val d = ParentModel(cursor.getString(cursor.getColumnIndex(TITLE)), items)
            list.add(d)
            cursor.moveToNext()
        }
        cursor.close()
    }

    return list

}

Наше третье решение этой проблемы - привязать две наши модели к одному адаптеру.

Минус этой строки кода val childList : List<ModelChild>? = nullИспользуйте один новый адаптер, который связан с действием, отображающим представление.Хотя это кажется самым логичным решением, с которым мы все еще имеем дело!

Как представление узнает, что загружается только один родитель и связанные дети?

Мы также признаем, что дизайн нашего внешнего ключа приведет к проблемам, если родительская запись обновлена ​​или удалена.Поэтому мы старались больше думать об этом дизайне как о способе иметь связанные индексы.И мы не смогли бы сделать UNION ALL, если только таблицы не были схожи по дизайну, поэтому плохой выбор формулировки Внешний ключ

У нас есть частичное решение по состоянию на 10/9/2018 Добавим дополнительныекодМы можем перебрать две таблицы Dept и ItemИ использовать println, чтобы получить формат, который мы хотим в RecyclerviewМы обновили код ModelParent

Вот наш код ViewActivity. Если вы закомментируете initRecycler() и оставите комментарий theGET()Вы увидите формат, который мы хотели бы добавить к представлению переработчика

class ViewActivity : AppCompatActivity() {

lateinit var recyclerView: RecyclerView

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

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

    //theGET()
    initRecycler()

}// end onCreate


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)
}


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)
    //}

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

    }

}

} // конец класса

Вот два адаптера ViewAdapter, связанные с ViewActivity

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)
        adapter = ViewChildAdapter(parent.children)
    }
}

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

} и код ViewChildAdapter

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, накачанные в адаптерах, и XML ViewActivity

<?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" />

XML the_view

<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>

И XML child_recycler

<?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" />

Наш пересмотренный вопрос заключается в том, как создать представление, созданное GET, и связать его с ViewActivity?

...