简体   繁体   中英

Show list from adapter in Object of Array form

I need to show a list from adapter. I've got the data with calling api, but it can't showed in the interface.

this is data model Table :

data class Table(val id : String, val nama: String, val tersedia: Boolean)

this is data model Tables that contain ArrayList of Table :

data class Tables (val daftarMeja : ArrayList<Table>)

this is mu adapter :

class MejaAdapter (private val tableList: ArrayList<Table>, private val clickListener: (Table) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){

private lateinit var tables: Tables
override fun getItemCount(): Int {
    return tableList.size
}

fun updateData(dataBaru: ArrayList<Table>) {
    tableList.clear()
    tableList.addAll(dataBaru)
    Log.i("tableListAdapter","balbalbla" + tableList.toString())
    notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val cellForRow = layoutInflater.inflate(R.layout.item_meja,parent,false)
    return PartViewHolder(cellForRow)
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    (holder as PartViewHolder).bind(tableList[position], clickListener)
}

class PartViewHolder (itemView: View): RecyclerView.ViewHolder(itemView){
    fun bind(table: Table, clicklistener: (Table) -> Unit){
        itemView.tv_table_name.text = table.nama
        if(table.tersedia){
            itemView.container_table.setBackgroundResource(R.color.colorTableAvailable)
            itemView.tv_table_name.setTextColor(Color.BLACK)
        }
        else {
            itemView.container_table.setBackgroundResource(R.drawable.gradient)
            itemView.tv_table_name.setTextColor(Color.WHITE)
        }
        itemView.setOnClickListener {clicklistener(table)}
    }
}

}

and this fun the activity :

private lateinit var tableList: ArrayList<Tables>
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_daftar_meja)

    tableList = ArrayList()

    /*init RecyclerView*/
    recyclerView_meja.layoutManager = GridLayoutManager(this, numberOfColumns(), GridLayoutManager.VERTICAL, false)
    recyclerView_meja.hasFixedSize()

    /*Set Adapter*/
    dataAdapter = MejaAdapter(tableItem) { tableItemClicked() }
    recyclerView_meja.adapter = dataAdapter

    //Show list table
    val idCafe = user.cafeId
    getTableList(idCafe)

}

private fun getTableList(idCafe:String){
    val apiService : Service = Client.getClient()!!.create(Service::class.java)
    apiService.getTable(idCafe).enqueue(object : Callback<Tables>{

        override fun onResponse(call: Call<Tables>?, response: Response<Tables>?) {

            Log.i("IdMeja", "id : " + response?.body())
            if (response != null && response.isSuccessful) {
                val listTable = response.body()
                if (listTable == null) {
                    Toast.makeText(this@MainActivity, "Tidak ada meja", Toast.LENGTH_SHORT).show()
                }
                else{
                    tables = listTable
                    // update list table

                    Log.i("adapter", "$dataAdapter")
                    dataAdapter.updateData(tableList)
                    Toast.makeText(this@MainActivity, "hahaha$tables", Toast.LENGTH_SHORT).show()
                }
            }
            else{
                Log.i("idCafe", " $idCafe")
                Toast.makeText(this@MainActivity, "Gagal dapat meja", Toast.LENGTH_SHORT).show()

            }
        }

        override fun onFailure(call: Call<Tables>?, t: Throwable?) {

            Log.i("fail",t.toString() )
            Toast.makeText(this@MainActivity, "Gagal", Toast.LENGTH_SHORT).show()
        }
    })
}

I think the problem is in the adapter, but i don't know how to fix it. Please help me to fix it.

We think this is a naming issue your use this line of code to name your View Holder

class MejaAdapter (private val tableList: ArrayList<Table>, private val clickListener: (Table) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){

Where you call it ViewHolder
Then you start using PartViewHolder
So change the code to use a consistent name PartViewHolder looks good to us
Here is our Adapter look at the naming convention used

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
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM