适用于现有recyclerView适配器的Android可扩展cardView

时间:2019-04-08 15:02:15

标签: android android-recyclerview material-design android-cardview

好的,所以我有一个现有的自定义回收器视图适配器,该适配器使用提供的项目填充回收器视图,并在布局中设置属性,如下所示,请尝试从代码中删除不相关的项目

class TransactionAdapter(val context: Context, var transactions: List<Transaction>) :
androidx.recyclerview.widget.RecyclerView.Adapter<TransactionAdapter.CustomViewHolder>() {
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
    val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val view = inflater.inflate(R.layout.transaction_list_inner_view, p0, false)
    return CustomViewHolder(view)
}



override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {
    p0.transactionNameTextView?.text = transactions[p1].title
    p0.transactionAmountTextView?.text = transactions[p1].amount
    if (!transactions[p1].location.isNullOrEmpty()) {
        p0.transactionLocationTextView?.text = transactions[p1].location
    } else {
        p0.transactionLocationTextView?.text = "N/A"
    }
    p0.transactionTimeTextView?.text = transactions[p1].createdAt
    p0.transactionDeleteButton?.setOnClickListener { println("working delete") }
}


class CustomViewHolder(v: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(v) {
    val transactionNameTextView: TextView? = v.findViewById(R.id.transactionNameTextView) as TextView?
    val transactionAmountTextView: TextView? = v.findViewById(R.id.transactionAmountTextView) as TextView?
    val transactionLocationTextView: TextView? = v.findViewById(R.id.transactionLocationTextView) as TextView?
    val transactionTimeTextView: TextView? = v.findViewById(R.id.transactionTimeTextView) as TextView?
    val transactionDeleteButton: AppCompatButton? = v.findViewById(R.id.transactionDeleteButton) as AppCompatButton?

}
}

现在,我想实现该库以使用可扩展的卡视图,以便仅显示例如交易的名称和金额,并进行其余的扩展,可以在此处找到此库https://github.com/AleSpero/ExpandableCardView ,图书馆要求我使用inner_view属性创建新布局,我这样做了,我的布局称为transaction_list_expandable_view.xml,看起来像这样

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                               xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
                                               android:layout_height="wrap_content"
                                               xmlns:app="http://schemas.android.com/apk/res-auto"
                                               tools:ignore="ExtraText">
<com.alespero.expandablecardview.ExpandableCardView
        android:id="@+id/transaction"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:title="testt"
        app:inner_view="@layout/transaction_list_inner_view"
        app:expandOnClick="true"
        app:animationDuration="300"
        app:startExpanded="false"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

现在出现了问题,我的自定义TransactionAdapter只处理一种布局,这就是我称为transaction_list_inner_view的布局,我如何才能让此适配器处理内部视图和可扩展视图并获得所需的结果? (具有相关标题的卡片列表,展开后会显示属于它们的其余详细信息)

很长的问题和代码,很抱歉,在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在检查了您正在使用的库的代码之后,我认为您不应该手动扩大内部视图(在您的适配器中),因为这是ExpandableCardView的责任,您应该为{{ 1}}。 它看起来像: transaction_list_expandable_view.xml

对于填充您的内部视图,我不确定在实例化val view = inflater.inflate(R.layout.transaction_list_expandable_view, p0, false)时内部视图是否已经在可展开视图中被放大。 如果是这种情况,则只需切换上面的内部=>可扩展视图即可。