clockbyte / admobadapter

It wraps your Adapter to display Admob native ads and banners in a ListView/RecyclerView data set. It based on the Yahoo fetchr project https://github.com/yahoo/fetchr
Apache License 2.0
237 stars 75 forks source link

FireBaseRecyclerAdapter with AdmobBannerRecyclerAdapterWrapper causes error when setting adapter #120

Closed AppsusUK closed 6 years ago

AppsusUK commented 6 years ago

Hi! Thank you for putting in the time to make this project :)

*Admobadapter version or commit:1.4.6*

*Android compileSdkVersion:27*

*Issue description briefly: When using a FirebaseRecyclerAdapter with a custom image view holder with an AdmobBanerRecyclerAdapterWrapper, I am unable to set the adapter to the firebaseRecyclerAdapter that uses my own ViewHolder giving this error:

Type mismatch: inferred type is FirebaseRecyclerAdapter<UploadInfo, ImgViewHolder> but RecyclerView.Adapter<RecyclerView.ViewHolder!>! was expected*

However, if I pass the RecyclerView.ViewHolder to the FirebaseRecyclerAdapter as the error suggests

adapter = object : FirebaseRecyclerAdapter<UploadInfo, RecyclerView.ViewHolder>(options)

The ads load but all my images will not.

screenshot_20180509-095856

*Steps to reproduce: `Activity.kt

    val layoutManager = LinearLayoutManager(this)
    layoutManager.reverseLayout = false
    rcvListImg.setHasFixedSize(true)
    rcvListImg.layoutManager = layoutManager

    val query = dataReference!!

    val options = FirebaseRecyclerOptions.Builder<UploadInfo>()
            .setQuery(query, UploadInfo::class.java)
            .setLifecycleOwner(this)
            .build()
    lateinit var adapter: FirebaseRecyclerAdapter<UploadInfo, ImgViewHolder>

    adapter = object : FirebaseRecyclerAdapter<UploadInfo, ImgViewHolder>(options) {

        val TYPE_AD: Int = 0
        val TYPE_POST: Int = 1

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImgViewHolder{
            val view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_image, parent, false)

            return ImgViewHolder(view)
        }

        override fun getItemViewType(position: Int): Int {
            if (position == 1) {
                return TYPE_AD
            }
            return TYPE_POST
        }

        override fun onBindViewHolder(holder: **ImgViewHolder**, position: Int, model: UploadInfo) {
            holder!!.itemView.tvImgName.text = model!!.name
            GlideApp.with(this@YourActivity)
                    .load(model.url)
                    .error(R.drawable.common_google_signin_btn_icon_dark)
                    .into(holder.itemView.imgView)
        }

    }

    val testDevicesIds = arrayOf(getString(R.string.bannertestad), AdRequest.DEVICE_ID_EMULATOR)

    adapterWrapper = AdmobBannerRecyclerAdapterWrapper.builder(this)
            .setAdapter(adapter)
            .setTestDeviceIds(testDevicesIds)
            .setNoOfDataBetweenAds(3)
            .setFirstAdIndex(4)
            .setSingleAdSize(AdSize.BANNER)
            .build()

    rcvListImg.adapter = adapterWrapper

ImgViewHolder.kt

import android.support.v7.widget.RecyclerView
import android.view.View

class ImgViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

Also tried by making the ImgViewHolder in Java but it had the same result ImgViewHolders.java

public class ImgViewHolders extends RecyclerView.ViewHolder {

    ImageView imgView;
    TextView tvImgName;

    ImgViewHolders(View itemView) {
        super(itemView);

        tvImgName = itemView.findViewById(R.id.tvImgName);
        imgView = itemView.findViewById(R.id.imgView);
    }
}

Any help would be greatly appreciated thanks!

AppsusUK commented 6 years ago

Fixed the issue, by removing the

override fun getItemViewType(position: Int): Int { if (position == 1) { return TYPE_AD } return TYPE_POST }