Доступ к элементам в объекте Kotlin - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь получить доступ к отдельным элементам внутри объекта, которые затем будут отображаться как часть представления. Цель состоит в том, чтобы каждый элемент был назначен переменным вне объекта.

Мой адаптер

private class MyCustomAdapter(list: List<Object>?, totalCount: Int): RecyclerView.Adapter<CustomViewHolder>() {
    private val listings = list;
    private val totalCount = totalCount;

    override fun getItemCount(): Int {
        if (listings != null) {
            return listings.size
        }
        return 0
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context);
        val cellForRow = layoutInflater.inflate(R.layout.auction_main, parent, false);
        return CustomViewHolder(cellForRow);
    }

    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
            val obj = listings?.get(position);
            holder.view.textView_auction_title?.text = obj.toString()
    }

}

listings?.get(position) выглядит так:

     {
        id = 2, 
        title = "testtitle1", 
        category = pants,
     }

Однако я пытается отображать идентификатор, заголовок и категорию как отдельные элементы, а не отображать весь объект как текст. Я новичок в Kotlin, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вам не следует использовать List<Object>.

Если все объекты вашего списка данных следуют одной и той же структуре id,title,category, тогда вы должны создавать модель из класса для этого списка.

Если у вас есть разные типы данных в этом списке, вы можете использовать List<Any> и сделать что-то вроде if (obj is IdTitleCategoryModel) view.text = obj.title или использовать List<JSONObject> (что я бы никогда не рекомендовал для модели с конкретным типом c)

1 голос
/ 07 августа 2020

Если входящие json данные всегда имеют один и тот же формат, вы должны добавить их в массив перед использованием, и у вас должна быть модель класса для этих переменных; (Сделайте это в своем фрагменте или действии, а не в адаптере.)

var listings = ArrayList<IncomingData>

// модель класса для данных:

class IncomingData(val id: Int, val title: String, val category: String)

// добавляем входящие данные в массив типа IncomingData: (во фрагменте или действии)

for (jsonindex in 0 until list.count()) {
    listings.add(
        IncomingData(
             jsonArray.getJSONObject(jsonIndex).getInt("id"),
             jsonArray.getJSONObject(jsonIndex).getString("title"),
             jsonArray.getJSONObject(jsonIndex).getString("category")
        )
    )
             
}

// теперь вы можете отправить эти данные на свой адаптер:

recyclerView.adapter = MyCustomAdapter(requireActivity(), listings, this@yourfragment_or_avtivity)

// после этого вы можете получить доступ к данным из вашего адаптера:

private class MyCustomAdapter(private val listFeed: ArrayList<IncomingData>, totalCount: Int): RecyclerView.Adapter<CustomViewHolder>() {
    
    private val totalCount = totalCount

    override fun getItemCount(): Int {
        return listFeed.count()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context);
        val cellForRow = layoutInflater.inflate(R.layout.auction_main, parent, false);
        return CustomViewHolder(cellForRow);
    }

    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
            val obj = listFeed.get(position)
            holder.view.textView_auction_title?.text = obj.title
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...