Kotlin переработчик не показывает данные - PullRequest
0 голосов
/ 15 сентября 2018

Наша проблема заключается в отображении записей из SQLite database в деятельности.Мы можем записать данные в базу данных, которую мы проверили, что данные записаны с DBBrowser.Другая часть этой проблемы - RecyclerAdapter.Мы потратили два дня на разработку синтаксиса.Ход выполнения программы прост: одна строка EditText сохраняется, затем мы переходим к PersonActivity, который должен отображать сохраненные данные.В PersonActivity мы запрашиваем базу данных для всех записей и возвращаем contactList.Наш дизайн MVC. Мы разместим код ниже для DBHelper, RecyclerAdapter и PersonActivity для отображения данных с задействованными файлами XML.Также Model Class.

class Contact{
    var id: Int = 0
    var name: String = ""
}

DBHelper вставляет данные и queryAll DB создается без необходимости для всего кода

// Start of CRUD functions
fun insert(values: ContentValues): Long {
    val Id = db!!.insert(dbTable, null, values)
    return Id
}

fun queryAll(): List<Contact> {
    val contactList = ArrayList<Contact>()
    val selectQuery = "SELECT  * FROM $dbTable"
    val cursor = db!!.rawQuery(selectQuery, null)
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                val contact = Contact()
                contact.id = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colId)))
                contact.name = cursor.getString(cursor.getColumnIndex(colName))
                contactList.add(contact)
            } while (cursor.moveToNext())
        }
    }
    cursor.close()
    return contactList
}

RecyclerAdapter ПРИМЕЧАНИЕ комментарии

class PersonRecyclerAdapter(val context:Context, val 
    items:List<Contact>):RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 

    RecyclerView.ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.single_card, parent, false))
    }

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

    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
        val item = items.get(position)
        viewHolder.bindItem(item)

        //viewHolder.itemName.text = items[position]
        //  WHAT IS CORRECT SYNTAX FOR LINE OF CODE ABOVE
    }
    private fun Any.bindItem(item: Contact) {
        // AS Added this fun ?
    }
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
       val itemName = view.tvName
    }
}

PersonActivity, которые должны отображать contactList данные

class PersonActivity : AppCompatActivity() {

    private var rvRecyclerView: RecyclerView? = null
    private var contactList:List<Contact> = ArrayList()

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

        val names = contactList

        rvRecyclerView?.layoutManager = LinearLayoutManager(this)
        rvRecyclerView?.setHasFixedSize(true)
        rvRecyclerView?.adapter = PersonRecyclerAdapter(this, names)

        callHOME()

    }

    private fun callHOME(){
        val db = DBHelper(this)
        contactList = db.queryAll()

    }
}

XML-файлы для PersonActivity и раздутый файл

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.androidstackoverflow.kotlincontacts.PersonActivity"
    tools:showIn="@layout/activity_person">

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

    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

Завышенное представление XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_new_card"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_margin="2dp"
    android:background="@color/colorAccent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:textColor="@color/color_Black"
        android:textSize="20sp"
        android:text="@string/app_name"
        android:textStyle="bold" />
</LinearLayout>

Пожалуйста, поймите, мы рассмотрели многочисленные варианты кода для этой проблемы!Прежде чем мы обратимся за помощью.Вопросы в два раза Как показать данные на PersonActivity?Правильный ли синтаксис PersonRecyclerAdapter?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Во-первых, @kumarshivang сделал несколько очень хороших предложений о том, как построить RecyclerAdapter, и его лучшей идеей было не использовать внутренний класс.Так что я опубликую здесь код, который использует намного более чистый дизайн кода для RecyclerAdapter.Хотя даже при более качественном RecyclerAdapter наша проблема невидения хранимых данных не была решена.Поскольку мы знали, что данные были в логике базы данных, мы могли бы сказать, что две вещи были неправильными: либо у данных не было контейнера для отображения представления, либо данные были недоступны, ДА, это была последняя, ​​и эта строка кода в PersonActivityчего не хватало.

listItems = db.queryAll()

Вот уборщик RecyclerAdapter (ВЫКЛЮЧЕН на ЗАВОД РЕАКТОРОВ, мы ИДЕМ)
Обратите внимание на слово "карта", которую автор использовал CardView виджет для отображения данных в виджете RecyclerView.

class HabitsAdapter(val habits:List<Habit>): RecyclerView.Adapter<HabitsAdapter.HabitViewHolder>() {

    class HabitViewHolder(val card:View):RecyclerView.ViewHolder(card)

    override fun onBindViewHolder(holder: HabitViewHolder, index: Int) {

        if(holder != null){
            val habit = habits[index]
            holder.card.tvTitle.text = habit.title
            holder.card.tvDescription.text = habit.description
            holder.card.ivINsingle_card.setImageBitmap(habit.image)
        }
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HabitViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.single_card, parent,false)
        return HabitViewHolder(view)
    }

    override fun getItemCount(): Int {
        return habits.size
    }
}
0 голосов
/ 16 сентября 2018

Прежде всего callHOME() должен быть вызван перед инициализацией имен переменных.То есть:

class PersonActivity : AppCompatActivity() {

private var rvRecyclerView: RecyclerView? = null
private var contactList:List<Contact> = ArrayList()

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

    callHOME()
    val names = contactList

    rvRecyclerView?.layoutManager = LinearLayoutManager(this)
    rvRecyclerView?.setHasFixedSize(true)
    rvRecyclerView?.adapter = PersonRecyclerAdapter(this, names)
}

private fun callHOME(){
    val db = DBHelper(this)
    contactList = db.queryAll()

} 

Вы также расширили свой класс PersonalRecyclerAdapter, указав неправильный RecyclerView.Adapter<Recycler.ViewHolder>, который вы должны использовать RecyclerView.Adapter<MyViewHolder>.RecyclerView.Adapter с собственным ViewHolder в качестве аргумента, а не держателем представления по умолчанию.

Использование функции расширения здесь излишне и ненужно.Хотя может быть использовано следующим образом ..

class PersonRecyclerAdapter(val context:Context, val 
    items:List<Contact>):RecyclerView.Adapter<MyViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
MyViewHolder {
     return MyViewHolder(LayoutInflater.from(context).inflate(R.layout.single_card,parent, false)) 
    }

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

    override fun onBindViewHolder(viewHolder: MyViewHolder,    position: 
    Int) {
      val item = items.get(position)
      viewHolder.bindItem(item)
    }

    private fun MyViewHolder.bindItem(item: Contact) {
       itemName.text = item.name
       // or use
       // itemView.findViewById<TextView>(R.id.tvName).text = item.name
    }


}

class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    val itemName = view.tvName
}

Вместо этого просто используйте это

 class PersonRecyclerAdapter(val context:Context, val 
    items:List<Contact>):RecyclerView.Adapter<MyViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
   MyViewHolder { return MyViewHolder(LayoutInflater.from(context).inflate(R.layout.single_card, parent, false)) }

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

    override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
        val item = items.get(position)
        viewHolder.itemName.text = items[position].name
        // or use
        // viewHolder.itemView.findViewById<TextView>(R.id.tvName).text = item.name
    }


}

class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {

     val itemName = view.tvName
 }
...