要解决我们的问题,我们有3个问题(问题)
还有3种可能的解决方案
为什么,因为在我们看来,解决这个问题似乎有多种方法可以解决这些问题。并且每个都取决于各种相关设计
我们正在使用Kotlin和SQLite DB以及两个表Parent和Child
这些表中的数据具有可用的标准CRUD函数,我们称其为后端
我们为每个父子表编写了Enter Activity,View Activity和Adapters
我们的目标是以以下方式查看两个表中的数据
产品
西红柿
阿瓦沃多斯
酒
啤酒
这里是每个表的Model类。您会注意到这些模型设计不正确的外键
class ModelParent {
var idD:Int = 0
var dept:String = ""
var fkD:Int = 0
val children : List<ModelChild>? = null
}
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,因此外键的措词选择不正确
截至2018年10月9日,我们有部分解决方案
将添加其他代码
我们可以遍历两个表Dept和Item
并使用println在Recyclerview中获取所需的格式
我们更新了ModelParent代码
这是我们的ViewActivity代码
如果您注释掉initRecycler()
并取消注释theGET()
您将看到我们想要添加到recyclerview的格式
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)
}
}
} //结束班级
这是两个适配器
与ViewActivity关联的ViewAdapter
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
}
}
以下是在适配器和ViewActivity XML中膨胀的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" />
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>
还有child_recycler 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"
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?