【问题标题】:Android: itemdecoration in recyclerview to be text and only if a certain condition is metAndroid:recyclerview中的itemdecoration是文本,并且只有在满足特定条件时
【发布时间】:2019-12-13 11:58:48
【问题描述】:

我有一个 recyclerview 显示已购买和要购买的物品。商品按购买日期排序,购买日期可以是过去也可以是未来。

我想在最后一个“过去”项目和第一个“未来”项目之间添加一个分隔符。我知道我应该添加如下装饰器:

DividerItemDecoration decoration = new DividerItemDecoration(Objects.requireNonNull(getActivity()), VERTICAL);
rvItems.addItemDecoration(decoration);

装饰器是显示在所有项目之间的细水平线。如何使装饰器成为文本,例如“↓ 过去的项目 ↑ 未来的项目”,并且仅在相关项目之间可见?

谢谢

【问题讨论】:

    标签: android android-recyclerview item-decoration


    【解决方案1】:

    在这种情况下,我认为最好有一个支持多种类型项目的回收器视图适配器。

    您拨打的separators 将是sections

    例子:

    sealed class Item {
    
      data class Section(val sectionText): Item
      data class Purchases(.......): Item
    
    }
    

    适配器:

    class MyAdapter(private val items: List<Item>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    
      companion object {
        const val TYPE_PURCHASES = 0
        const val TYPE_SECTION = 1
      }
    
      override fun getItemViewType(position: Int): Int {
        val type = when (items[position]) {
          is Items.Section -> TYPE_SECTION
          // other types...
          else -> TYPE_PURCHASES
        }
        return type
      }
    
      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val viewHolder: RecyclerView.ViewHolder = when (viewType) {
          TYPE_PURCHASES -> {}
          // other view holders...
          else -> {}
        }
        return viewHolder
      }
    
      override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
         when(holder) {
            is SectionViewHolder -> bindSectionViewHolder(holder)
            is PurchasesViewHolder -> bindSectionViewHolder(holder)
         }
      }
    
      override fun getItemCount() = items.size
    }
    

    然后为每个type创建对应的ViewHolders,并在onCreateViewHolder处实例化它们。

    当您在适配器中传递项目列表时,您应该具有将部分或项目添加到列表中的逻辑。

    我的一个项目中的类似示例:

            .subscribeBy(onSuccess = {
                val list = mutableListOf<IViewModel>()
                val previousBookingDate = Calendar.getInstance()
                val bookingDate = Calendar.getInstance()
                it.data?.fold(Date(0)) { previousHeader, bookable ->
                    previousBookingDate.time = previousHeader
                    bookingDate.time = bookable.getStartDate()
                    val timeIgnoringComparator = DateUtils.TimeIgnoringComparator()
                    if (timeIgnoringComparator.compare(previousBookingDate, bookingDate) != 0) {
                        list.add(SectionViewModel(bookable.getStartDate(), isDefaultSearch || isDefaultCenterSelected()))
                    }
                    list.add(BookableItemViewModel(bookable))
    
                    bookable.getStartDate()
                }
    
                searchResultsLiveData.value = list
            }, onError = {
                isError.setValue(Event(Pair(null, Runnable { performSearch() })))
            })
    

    我建议查看this 库,以快速制作具有不同项目类型的列表。

    【讨论】:

    • 你写的“在这种情况下”,你的意思是它应该是文本,还是它应该在某种条件下出现?
    • 我会说两者。您的案例更多地是指一个部分而不是一个装饰。
    • 如果我需要它只是一条特定颜色的线?
    • 然后添加一个物品装饰器。你可以两者兼得。
    • 我怎样才能只在特定条件下做到这一点,以便它只会在提到的 2 个项目之间出现一次?
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多