Для решения нашей проблемы у нас есть 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?