【问题标题】:Show list from adapter in Object of Array form以数组对象形式显示适配器列表
【发布时间】:2019-03-18 14:07:31
【问题描述】:

我需要显示来自适配器的列表。调用api得到了数据,但是界面显示不出来。

这是数据模型表:

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

这是包含 ArrayList of Table 的数据模型表:

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

这是 mu 适配器:

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)}
    }
}

}

这个活动很有趣:

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()
        }
    })
}

我认为问题出在适配器上,但我不知道如何解决。 请帮我解决它。

【问题讨论】:

  • 您是否在onResponse() 回调中更新tableList?您调用dataAdapter.updateData(tableList),但不要在它之前更改tableList 变量

标签: java android listview kotlin android-adapter


【解决方案1】:

我们认为这是一个命名问题,您使用这行代码来命名您的 View Holder

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

你在哪里称它为 ViewHolder
然后你开始使用PartViewHolder
所以更改代码以使用一致的名称PartViewHolder 对我们来说看起来不错
这是我们的适配器看一下使用的命名约定

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
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2020-12-03
    相关资源
    最近更新 更多