0

I am new to android development so this may seem like an obvious question but I can't figure it out. I am trying to populate a list view with data stored in a SQLite database. I have managed to populate the database.k However, I can't figure out why the data is not showing up in the list view. My code runs fine with no errors. Can someone please help me out. I will truly appreciate it!

ActivityMain.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">


    <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:layout_gravity="top|end"
            android:src="@drawable/ic_add_input_24dp"
            android:layout_marginTop="10dp"
            android:id="@+id/fab1"
            android:focusable="true"
            android:background="@color/whiteTrans" app:backgroundTint="#aaaaaa"/>
    <ListView
            android:id="@+id/mainClientList"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="0dp"/>
</LinearLayout>

item_clients

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ImageView
            android:layout_marginStart="20dp"
            android:layout_marginLeft="20dp"
            android:id="@+id/edt_client"
            android:tint="#898989"
            android:src="@drawable/ic_mode_edit_black_24dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:contentDescription="@string/todo"/>
    <TextView
            android:id="@+id/clientTxtId"
            android:text="@string/test_id"
            android:layout_marginLeft="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dp"
    />
    <TextView
            android:id="@+id/clientTxtName"
            android:text="@string/test_name"
            android:layout_marginLeft="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
    />
    <TextView
            android:id="@+id/clientTxtAddress"
            android:text="@string/test_address"
            android:layout_marginLeft="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dp"/>
    <ImageView
            android:id="@+id/dlt_client"
            android:tint="#898989"
            android:src="@drawable/ic_delete_black_24dp"
            android:layout_marginLeft="70dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:contentDescription="@string/todo"
            android:layout_marginStart="70dp"/>

</LinearLayout>

AddorEditclients

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content"
        tools:context=".Add_or_Edit_Clients">
        <EditText

                android:layout_marginTop="250dp"
                android:id="@+id/customer_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:hint="@string/customer_name"/>
        <EditText
                android:id="@+id/customer_address"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:hint="@string/customer_address"/>
        <Button
                android:text="@string/add"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:layout_editor_absoluteY="310dp"
                tools:layout_editor_absoluteX="161dp"
                android:id="@+id/btn_add"/>
</LinearLayout>

Const.kt

package com.abc.clientsapp

object Const {
    public val ADD = "add"
    public val UPDATE = "update"
    public val WHAT = "what"
    public val DATABASE_NAME = "Client_Database"
    public val DATABASE_VERSION = 1
    public val CLIENT_KEY = "client_key"
}

Client.kt

package com.abc.clientsapp

import android.os.Parcel
import android.os.Parcelable
class Client :Parcelable {
    var id:Int = 0
    var name:String =""
    var address:String = ""
    constructor()
    constructor(id:Int,name:String,address: String)
    {
        this.id = id
        this.name = name
        this.address = address
    }

    override fun toString(): String {
        return "client_Table(id = '$id', name='$name', address = '$address')"
    }
    protected constructor(`in`: Parcel)  {
        id = `in`.readInt()
        name = `in`.readString()!!
        address = `in`.readString()!!
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(address)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Client> {
        override fun createFromParcel(parcel: Parcel): Client {
            return Client(parcel)
        }

        override fun newArray(size: Int): Array<Client?> {
            return arrayOfNulls(size)
        }
    }
}

DatabaseHelper.kt

package com.abc.clientsapp.Database

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import com.abc.clientsapp.Client
import com.abc.clientsapp.Const.DATABASE_NAME
import com.abc.clientsapp.Const.DATABASE_VERSION
import kotlin.collections.ArrayList

class DatabaseHelper(context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int) : SQLiteOpenHelper(context, name, factory, version) {
    val CLIENT_TABLE : String = "client_Table"
    val CLIENT_ID : String = "id"
    val CLIENT_NAME : String = "name"
    val CLIENT_ADDRESS : String = "address"
    companion object{
                        private var instance : DatabaseHelper? = null
                        fun getinstnce(ctx:Context):DatabaseHelper
                        {
                            if (instance==null)
                            {
                                instance = DatabaseHelper(ctx, DATABASE_NAME,null, DATABASE_VERSION)
                            }
                            return instance!!
                }
    }
    val createsql : String = "create table $CLIENT_TABLE($CLIENT_ID INTEGER PRIMARY KEY AUTOINCREMENT, $CLIENT_NAME TEXT , $CLIENT_ADDRESS TEXT)"
    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL(createsql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $CLIENT_TABLE")
        onCreate(db)
    }
    fun addclient(name: String?,address:String?):Long
    {
        val values= ContentValues()
        values.put(CLIENT_NAME,name)
        values.put(CLIENT_ADDRESS,address)
        return this.writableDatabase.insert(CLIENT_TABLE,null,values)
    }
    fun updateclient(id:Int?,name: String?,address:String?):Int
    {
        val values = ContentValues()
        values.put(CLIENT_NAME,name)
        values.put(CLIENT_ADDRESS,address)
        return this.writableDatabase.update(CLIENT_TABLE,values,"$CLIENT_ID=?", arrayOf("$id"))
    }
    fun deleteclient(id: Int?):Int
    {
        return this.writableDatabase.delete(CLIENT_TABLE,"$CLIENT_ID=?", arrayOf("$id"))
    }
    fun getallclients() :ArrayList<Client>
    {
        var list: ArrayList<Client> = ArrayList()
        var cursor:Cursor = this.writableDatabase.query(CLIENT_TABLE, arrayOf(CLIENT_ID,CLIENT_NAME,CLIENT_ADDRESS),null,null,null,null,null)
        if (cursor.moveToFirst())
        {
            do {
                var cl = Client()
                cl.id = cursor.getInt(0)
                cl.name = cursor.getString(1)
                cl.address = cursor.getString(2)
                list.add(cl)
            }while (cursor.moveToNext())
        }
        this.writableDatabase.close()
        return list
    }
}

Add or edit clients.kt

package com.abc.clientsapp

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.abc.clientsapp.Database.DatabaseHelper
import android.view.MenuItem
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_add_or__edit__clients.*
import kotlinx.android.synthetic.main.item_clients.*

class Add_or_Edit_Clients : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_or__edit__clients)
        if (intent.getStringExtra(Const.WHAT).equals(Const.ADD)){
            btn_add.text = "ADD"
        }
        else{
            btn_add.text = "UPDATE"
            var cli : Client = intent.getParcelableExtra(Const.CLIENT_KEY)
            clientTxtName.setText(cli.name)
            clientTxtAddress.setText(cli.address)
        }
        btn_add.setOnClickListener{
            if (intent.getStringExtra(Const.WHAT) == Const.ADD)
            {
                addclient()
                finish()
            }
            else {
                updateclient(intent.getParcelableExtra(Const.CLIENT_KEY))
            }
        }

    }
    fun logmsg(msg:String)
    {
        Log.d("TAG",msg)
    }
    fun validateinput():Boolean
    {
        if (clientTxtName?.text.toString().trim().equals("")||clientTxtAddress?.text.toString().trim().equals(""))
        {
            Toast.makeText(this,"Please Fill all the Fields", Toast.LENGTH_SHORT).show()
            return false
        }
        else
            return true
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        if(item!=null)
        {
            when(item.itemId)
            {
                android.R.id.home->finish()
            }
        }
        return super.onOptionsItemSelected(item)
    }
    fun addclient()
    {
        if(validateinput())
        {
            DatabaseHelper.getinstnce(this).addclient(clientTxtName.text.toString(),clientTxtAddress.text.toString())
        }
    }
    fun updateclient(client: Client)
    {
        if(validateinput())
        {
            DatabaseHelper.getinstnce(this).updateclient(client.id,client.name,client.address)
        }
    }
}

MainActivity

package com.abc.clientsapp

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Parcelable
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.abc.clientsapp.Const.WHAT
import com.abc.clientsapp.Const.ADD
import com.abc.clientsapp.Database.DatabaseHelper
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        var adapter = ClientAdapter(this@MainActivity)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mainClientList.adapter = adapter
        fab1.setOnClickListener {
            var intent = Intent(this@MainActivity,Add_or_Edit_Clients::class.java)
            intent.putExtra(WHAT,ADD)
            startActivity(intent)
        }

    }
    class ClientAdapter() : BaseAdapter() {
        private var list:ArrayList<Client> ?= null
        private var context:Context? = null
        constructor(context: Context?) : this()
        {
            this.list = DatabaseHelper.getinstnce(context!!).getallclients()
            this.context = context
        }
        fun updatelist() {
            this.list = DatabaseHelper.getinstnce(context!!).getallclients()
            notifyDataSetChanged()
        }

        override fun getView(position: Int, view: View?, parent: ViewGroup?): View {
            var convertView : View? = view
            if (convertView == null){
            convertView = View.inflate(context, R.layout.item_clients, null)}
            var txtId : TextView = convertView?.findViewById(R.id.clientTxtId) as TextView
            var txtName : TextView = convertView.findViewById(R.id.clientTxtName) as TextView
            var txtAddress : TextView = convertView.findViewById(R.id.clientTxtAddress) as TextView
            var imgEdt: ImageView = convertView.findViewById(R.id.edt_client) as ImageView
            var imgDlt: ImageView = convertView.findViewById(R.id.dlt_client) as ImageView
            txtId.text = list?.get(position)?.id.toString()
            txtName.text = list?.get(position)?.name
            txtAddress.text = list?.get(position)?.address
            imgEdt.setOnClickListener {

                var intent = Intent(context, Add_or_Edit_Clients::class.java)
                intent.putExtra(Const.WHAT, Const.UPDATE)
                intent.putExtra(Const.CLIENT_KEY, (list?.get(position)) as Parcelable)
                context?.startActivity(intent)

            }
            imgDlt.setOnClickListener {

                DatabaseHelper.getinstnce(context!!).deleteclient(list?.get(position)?.id)
                list?.removeAt(position)
                notifyDataSetChanged()
            }
            return convertView
        }
        override fun getItem(position: Int): Client? {
            return list?.get(position)
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getCount(): Int {
            return list!!.size
        }
    }

}
  • Possible duplicate of [SQLite Data Adapter not displaying data](https://stackoverflow.com/questions/45516848/sqlite-data-adapter-not-displaying-data) – Moddasir Jul 27 '19 at 01:16
  • Impossible to say what the issue is as the only **ListView** in the provided code is in **ActivityMain.XML**, that itself only coded the once, and thus most probably used by **MainActivity** who's code has not been provided. – MikeT Jul 27 '19 at 09:39

0 Answers0