0

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

这是我的代码:

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 属性,但我没有找到解决方案。有什么建议么?

适配器是这样创建的:

 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

    }
4

2 回答 2

0

你能试试这个

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
        }

        .....
    }

}

Data从您的Fragment或传递Activity(我的示例使用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
 }

...
于 2020-10-29T22:33:24.383 回答
0

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

于 2020-10-30T00:20:12.790 回答