【问题标题】:How to create custom arrayAdapter without context attribute如何创建没有上下文属性的自定义 arrayAdapter
【发布时间】:2021-02-12 05:11:30
【问题描述】:

对于一个学校项目,我制作了一个带有上下文、资源和项目属性的自定义数组适配器。今天我收到了老师的反馈,他希望我找到一个我没有 Context 属性的解决方案,因为他不喜欢我总是需要指定上下文。

这是我的代码:

class TalentListAdapter(
    var mCtx: Context,
    var resources: Int,
    var items: MutableList<Talent>
) : ArrayAdapter<Talent>(mCtx, resources, items) {

    lateinit var mItem: Talent

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val layoutInflater: LayoutInflater = LayoutInflater.from(mCtx)
        val view: View = layoutInflater.inflate(resources, null)
        mItem = items[position]

        //set name of talent
        val talentTextView: TextView = view.findViewById(R.id.talentName)
        talentTextView.text = mItem.toString()

        return view
    }
}

他想摆脱 mCtx: Context 属性,但我没有找到解决方案。有什么建议吗?

适配器是这样创建的 atm:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val listView: ListView = binding.talentList

        // set custom adapter for talent_list
        val adapter = TalentListAdapter(view.context, R.layout.talentlayout, binding.talentViewModel?.getTalents()?.value as MutableList<Talent>)
        listView.adapter = adapter

    }

【问题讨论】:

  • 如果您想使用ArrayAdapter,您需要将上下文作为参数传递。您应该始终传递aplicationContext 以避免内存泄漏。您的问题没有具体说明适配器的用途,可能还有其他选择,例如 RecyclerView Adapter 或 BaseAdapter。

标签: android kotlin android-arrayadapter custom-arrayadapter


【解决方案1】:

你可以试试这个

class YourAdapter() : RecyclerView.Adapter<YourAdapter.ViewHolder>() {

    inner class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)

    var Data: List<YourResponse> = emptyList()
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(
            R.layout.your_layout, parent, false
        )
        return ViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val getYourModel = Data[position]

        val Binding = holder.view

        Binding.yourTextView.apply{
            text = getYourModel.yourField
        }

        .....
    }

}

并从您的FragmentActivity 传递Data(我的示例使用Retrofit2

private var theList: List<YourResponse> = emptyList()
private val theAdapter =yourAdapter()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    onUpdateData()
}

 private fun onUpdateData() {
     ...
         override fun onResponse(call: Call<YourResponse>, response: Response<YourResponse>) {
             val body = response.body()?.results
             if (response.isSuccessful && body != null) {
                 onUpdateDataSuccess(body)
             } else {
                 // Something
             }
         }
     ...
 }

 private fun onUpdateDataSuccess(data: List<YourResponse>) {
     theList = data
     theAdapter.Data = data
 }

...

【讨论】:

    【解决方案2】:

    你只需要 context 而膨胀,所以你应该使用 parent.context 而不是显式的上下文。 Parent.Context 表示实现此回收器视图的 Activity/Fragment。

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多