davideas / FlexibleAdapter

Fast and versatile Adapter for RecyclerView which regroups several features into one library to considerably improve the user experience :-)
Apache License 2.0
3.55k stars 552 forks source link

The ScrollableHeader is not showing the view I specified in the model class #414

Closed johnernest02 closed 7 years ago

johnernest02 commented 7 years ago

Please check off the following points BEFORE submitting a new issue / asking support.

I am using Android Studio 3.0.0 and Kotlin

and importing the library : compile 'eu.davidea:flexible-adapter:5.0.0-rc1'

I've already checked if the actual view is there, so I enabled the layout boundaries option and seen that it is there. It just looks like there is a white scrim above it? I already tried changing the booleans and using the IHeader interface instead of the IFlexible one. I'm not getting what I am doing wrong.

I am using two types of items in my adapter that is why I added a specific type in the declaration of the adapter and using Kotlin extension functions. Please guide if you have any suggestions to improve my code more so to fix this issue

private var adapter: FlexibleAdapter<in IFlexible<in FlexibleViewHolder>> = NewsfeedAdapter(ArrayList(), this, this)

class NewsfeedAdapter<T : IFlexible<in FlexibleViewHolder>> constructor(
        list: List<T>,
        listeners: Any,
        private var clickListener: View.OnClickListener
) : FlexibleAdapter<T>(list, listeners) {

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int, payloads: MutableList<Any?>?) {
        if (holder is PostFlexible.ViewHolder) {
            var item = getItem(position)

            holder.btnDelete.setTag(R.id.item_post, item)
            holder.btnDelete.setOnClickListener(clickListener)
        }
        super.onBindViewHolder(holder, position, payloads)
    }
}

Here is the class I created for the Scrollable Header

class NewPostItemHeader : IHeader<NewPostItemHeader.ViewHolder> {
    private var enabled: Boolean = true

    private var swipeable = false

    private var hidden = false

    private var selectable = false

    private var draggable = false

    var id: String? = null

    var userImage: String? = null

    override fun isEnabled(): Boolean {
        return enabled
    }

    override fun setEnabled(enabled: Boolean) {
        this.enabled = enabled
    }

    override fun setSwipeable(swipeable: Boolean) {
        this.swipeable = swipeable
    }

    override fun isSwipeable(): Boolean {
        return swipeable
    }

    override fun isHidden(): Boolean {
        return hidden
    }

    override fun setHidden(hidden: Boolean) {
        this.hidden = hidden
    }

    override fun isSelectable(): Boolean {
        return selectable
    }

    override fun setSelectable(selectable: Boolean) {
        this.selectable = selectable
    }

    override fun isDraggable(): Boolean {
        return draggable
    }

    override fun setDraggable(draggable: Boolean) {
        this.draggable = draggable
    }

    override fun getLayoutRes(): Int {
        return R.layout.item_new_post_header
    }

    override fun equals(other: Any?): Boolean {
        if (other != null && other is PostFlexible) {
            return other.id == id
        }
        return false
    }

    override fun hashCode(): Int {
        return id?.hashCode() as Int
    }

    override fun bindViewHolder(adapter: FlexibleAdapter<out IFlexible<*>>?, holder: ViewHolder, position: Int, payloads: MutableList<Any?>?) {
        val context: Context = holder.itemView.context

        GlideApp.with(context)
                .clear(holder.userImage)
        if (CommonUtils.isNotEmpty(userImage.toString())) {
            GlideApp.with(context)
                    .load(userImage)
                    .placeholder(R.mipmap.icon_user)
                    .into(holder.userImage)
        }
    }

    override fun createViewHolder(adapter: FlexibleAdapter<out IFlexible<*>>?, inflater: LayoutInflater?, parent: ViewGroup?): ViewHolder {
        return ViewHolder(inflater?.inflate(layoutRes, parent, false) as View, adapter)
    }

    class ViewHolder(
            view: View,
            adapter: FlexibleAdapter<out IFlexible<*>>?
    ) : FlexibleViewHolder(view, adapter) {
        val userImage: ImageView by lazy { view.findViewById<ImageView>(R.id.userImage) }
    }
}

Here is the layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="@android:color/white"
              android:orientation="horizontal"
              android:padding="10dp">

    <ImageView
        android:id="@+id/userImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginEnd="10dp"/>

    <TextView
        android:id="@+id/cta"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="Let's make an announcement!"
        android:textColor="@android:color/black"
        android:textSize="20sp"/>
</LinearLayout>

I used an extension function to add it into the adapter like so:

private fun FlexibleAdapter<in IFlexible<in FlexibleViewHolder>>.addScrollableHeader(newPostheader: NewPostItemHeader) {
    this.addScrollableHeader(newPostheader as IFlexible<in FlexibleViewHolder>)
}

The layout look like this right now

capture _2017-07-24-00-14-18

johnernest02 commented 7 years ago

Following up on this. When I use addItem instead of addScrollableHeader, the layout shows perfectly fine.

johnernest02 commented 7 years ago

I don't know what happened. But it's working fine now. Maybe just a build or compile issue