如何获取RecyclerView适配器的外部数组值

时间:2019-01-22 20:30:01

标签: android android-fragments kotlin android-recyclerview recycler-adapter

我正在尝试使用RecyclerView以特定顺序显示CardView中值的数组,即1 CardView中的“标题A”和“字幕A”;另外还有“标题B”和“字幕B”。有没有一种方法可以从片段中的数组获取值而无需创建新的详细类,还是必须使用data class来实现这一点?

片段类

class MyFragment : androidx.fragment.app.Fragment() {
    private lateinit var mRecyclerView: RecyclerView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_rv, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        val v = view

        mRecyclerView = v!!.findViewById<RecyclerView>(R.id.my_recyclerview)

        mRecyclerView.layoutManager = LinearLayoutManager(activity)

        val myList = mutableListOf(
                RVAdapterTConnections.ITEM_A,
                RVAdapterTConnections.ITEM_B,
                RVAdapterTConnections.ITEM_B
        )

        val titlesList = mutableListOf(
                "Title A",
                "Title B"
        )

        val subtitlesList = mutableListOf(
                "Subtitle A",
                "Subtitle B"
        )

        val mAdapter = MyRVAdapter(myList, titlesList)

        mRecyclerView.adapter = mAdapter

        super.onActivityCreated(savedInstanceState)
    }
}

适配器类

internal class MyRVAdapter(private val listViewType: List<Int>, private val myList: List<CharSequence>) : RecyclerView.Adapter<MyRVAdapter.ViewHolder>() {

    companion object {
        const val ITEM_A = 1
        const val ITEM_B = 2
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return when (viewType) {
            ITEM_A -> ViewHolderItemA(inflater.inflate(R.layout.layout_item_a, parent, false))
            else -> ViewHolderItemB(inflater.inflate(R.layout.layout_item_b, parent, false))
        }
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val viewType = listViewType[position]
        when (viewType) {
            ITEM_A -> {
                val viewHolderA = holder as ViewHolderItemA
                viewHolderA.textView.text = "Lorem Ipsum"
            }
            ITEM_B -> {
                val viewHolderB = holder as ViewHolderItemB
                viewHolderB.ivExpandCollapse.setImageDrawable(ContextCompat.getDrawable(holder.ivExpandCollapse.context, R.drawable.ic_keyboard_arrow_down))
                viewHolderB.tvTitle.text = titlesList[position]
                viewHolderB.tvSubtitle.text = subtitlesList[position]
            }
            else -> {
                val viewHolderA = holder as ViewHolderItemA
                viewHolderA.textView.text = "Lorem Ipsum"
            }
        }
    }

    override fun getItemCount(): Int = listViewType.size

    override fun getItemViewType(position: Int): Int = listViewType[position]

    open inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    inner class ViewHolderItemA(itemView: View) : ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.my_custom_tv)
    }

    inner class ViewHolderItemB(itemView: View) : ViewHolder(itemView) {
        val tvTitle: TextView = itemView.findViewById(R.id.tv_title)
        val tvSubtitle: TextView = itemView.findViewById(R.id.tv_subtitle)
    }
}

数据类

data class MyItem (val title: String, val subtitle: String)

1 个答案:

答案 0 :(得分:0)

视图类型的普通对象可以从数据模型派生,最常见的是从某种类型的groupId中派生。这些titlesListsubtitlesList需要更换;使用BaseAdapter来填充RecyclerView.Adapter。例如(加载字符串资源,其中SpinnerItem是一个简单的数据模型):

abstract class BaseArrayAdapter : BaseAdapter {

    private var mItems: ArrayList<SpinnerItem>? = null

    private var layoutInflater: LayoutInflater? = null

    internal constructor(@NonNull context: Context) {
        this.layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    }

    internal constructor(@NonNull context: Context, @NonNull @ArrayRes arrayKeys: Int, @NonNull @ArrayRes arrayValues: Int) {
        this.layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        this.setItems(context, arrayKeys, arrayValues)
    }

    @NonNull
    @Override
    override fun getItem(position: Int): SpinnerItem {
        return this.mItems!!.get(position)
    }

    @Override
    override fun getItemId(position: Int): Long {
        return this.mItems!!.get(position).id!!
    }

    @NonNull
    @Override
    override fun getView(position: Int, @Nullable view: View?, @NonNull parent: ViewGroup): View {
        var convertView = view
        if (convertView == null) {
            convertView = this.layoutInflater!!.inflate(R.layout.support_simple_spinner_dropdown_item, parent, false)
        }
        convertView!!.setTag(this.mItems!!.get(position))
        val textView: TextView = convertView.findViewById(android.R.id.text1)
        textView.text = this.mItems!![position].name
        textView.setAllCaps(true)
        return convertView
    }

    private fun clearItems() {
        if (this.mItems != null) {
            this.mItems!!.clear()
        } else {
            this.mItems = ArrayList()
        }
    }

    internal fun setItems(@NonNull context: Context, @NonNull @ArrayRes arrayKeys: Int, @NonNull @ArrayRes arrayValues: Int) {
        this.clearItems()
        val res = context.getResources()
        val keys = res.getStringArray(arrayKeys)
        val values = res.getStringArray(arrayValues)
        for (i in keys.indices) {
            this.mItems!!.add(i, SpinnerItem((i + 1).toLong(), keys[i], values[i]))
        }
    }

    override fun getCount(): Int {
        return this.mItems!!.size
    }
}

抽象类的一些子类:

class SomeAdapter(@NonNull context: Context) : BaseArrayAdapter(context) {
    init {
        this.setItems(context, R.array.some_keys, R.array.some_values)
    }
}

,然后在RecyclerView.Adapter中:

init {
    this.setItems(new SomeAdapter(context));
}