Search code examples
androidandroid-recyclerviewadaptertablet

Recyclerview in tablets is being called multiple times on lollipop or lower devices


I know this sounds kind of crazy, but my recyclerview adapter for tablets is behaving differently for different android versions. In my marshmallow tablet its working fine, i.e it only loads the views which are visible on the screen and loads the remaining views only when scrolling is done.

But when testing with other android versions(lollipop and below), it seems to be loading every view in my array without scrolling the recyclerview. And the whole array is loaded 4 or 5 times without doing anything.

This causes my app to freeze while scrolling in these devices.

I don't think its a problem with the code because it works perfectly in marshmallow tablets.

So can anyone please tell me what the problem might be??

I hope my question in clear enough.

Here is my adapter code, just in case.

public class MagazineTOC_Tab_Adapter extends
    RecyclerView.Adapter<MagazineTOC_Tab_Adapter.TOCHolder> {
private ArrayList<Category> magazineCategoryList;
private ArrayList<ArticlesItem> magazineArticleList;
private Context mContext;
private AccessPreference mAccessPreference;
private OnArticleclickListener mOnTOCclickListener;
private final int CATEGORY = 301,TYPE_THREE_AD = 601,TYPE_ONE_AD = 401,TYPE_TWO_AD = 501;

public MagazineTOC_Tab_Adapter(ArrayList<ArticlesItem> magazineArticleList, Context mContext) {
    this.magazineCategoryList = magazineCategoryList;
    this.magazineArticleList = magazineArticleList;
    this.mContext = mContext;
    this.mOnTOCclickListener = (OnArticleclickListener) mContext;
    this.mAccessPreference = new AccessPreference(mContext);

}

@Override
public TOCHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    switch(viewType)
    {
        case CATEGORY:
            View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rootview_magazine_toc_tab, parent, false);
            TOCHolder myHeaderViewHolder = new TOCHolder(headerView, viewType);
            Log.d("CreateviewHolder", ""+CATEGORY);
            return myHeaderViewHolder;
        case TYPE_ONE_AD:
            View adView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rootview_toc_ad_one, parent, false);
            TOCHolder adViewHolder = new TOCHolder(adView, viewType);
            Log.d("CreateviewHolder", ""+TYPE_ONE_AD);
            return adViewHolder;
        case TYPE_TWO_AD:
            View adView2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.rootview_toc_ad_two, parent, false);
            TOCHolder adViewHolder2 = new TOCHolder(adView2, viewType);
            Log.d("CreateviewHolder", ""+TYPE_TWO_AD);
            return adViewHolder2;
        case TYPE_THREE_AD:
            View adView3 = LayoutInflater.from(parent.getContext()).inflate(R.layout.rootview_toc_ad_three, parent, false);
            TOCHolder adViewHolder3 = new TOCHolder(adView3, viewType);
            Log.d("CreateviewHolder", ""+TYPE_THREE_AD);
            return adViewHolder3;
    }
    return null;
}

@Override
public void onBindViewHolder(final TOCHolder holder,final int position) {
    if (magazineArticleList.get(position).getViewtype() == CATEGORY) {
        if(position==0)
        {
            Glide.get(mContext).clearMemory();
        }
        String category = magazineArticleList.
                get(position).getCategoryDescription();
        if (magazineArticleList.get(position).getLockStatus().equalsIgnoreCase("true")
                && ( !mAccessPreference.isLogin()
                ||  mAccessPreference.isSubscriptionExpired()
                ||  mAccessPreference.getSubscriberId().equalsIgnoreCase("") )
                ) {
            holder.mLoackImage.setImageResource(R.drawable.ic_lock);
        }
        else if(magazineArticleList.get(position).getReadStatus().equalsIgnoreCase("yes")){
            holder.mLoackImage.setImageResource(R.drawable.tick_gray);
        }
        else {
            holder.mLoackImage.setImageResource(R.drawable.ico_magazine_arrow);
        }

        if (position == 0) {
            holder.mAdViewTab.setVisibility(View.GONE);
            holder.mCategoryTitle.setVisibility(View.VISIBLE);
            holder.mTOCImage.setVisibility(View.VISIBLE);
            holder.subcat_row_title.setVisibility(View.VISIBLE);
            holder.subcat_row_title.setText(Html.fromHtml(magazineArticleList.
                    get(position).getSubCategory()));
        } else if (position > 0) {
            // loadAd(holder.mAdView);
            if (magazineArticleList.get(position).getSubCategory().equalsIgnoreCase("none")) {
                holder.subcat_row_title.setVisibility(View.GONE);
            } else if (magazineArticleList.get(position).getSubCategory().equalsIgnoreCase(magazineArticleList.get(position - 1).getSubCategory())) {
                holder.subcat_row_title.setVisibility(View.GONE);

            } else {
                holder.subcat_row_title.setVisibility(View.VISIBLE);
                holder.subcat_row_title.setText(Html.fromHtml(magazineArticleList.
                        get(position).getSubCategory()));
            }



            if (category.equalsIgnoreCase(magazineArticleList.
                    get(position - 1).getCategoryDescription())) {
                holder.mCategoryTitle.setVisibility(View.GONE);
                holder.mTOCImage.setVisibility(View.GONE);
                holder.mAdViewTab.setVisibility(View.GONE);
            } else {
                holder.mCategoryTitle.setVisibility(View.VISIBLE);
                holder.mTOCImage.setVisibility(View.VISIBLE);
                //   holder.mAdView.setVisibility(View.VISIBLE);
            }
        } else {
            holder.mCategoryTitle.setVisibility(View.VISIBLE);
            holder.mTOCImage.setVisibility(View.VISIBLE);
            //  holder.mAdView.setVisibility(View.VISIBLE);
        }
        holder.mCategoryTitle.setText(Html.fromHtml(category));
        holder.mTitleHeaderTxt.setText(Html.fromHtml(magazineArticleList.
                get(position).getArticleTitle()));

        if (magazineArticleList.
                get(position).getImagePath() != null)
            if (magazineArticleList.
                    get(position).getImagePath().length() > 0) {

                Glide.with(mContext)
                        .load(magazineArticleList.
                                get(position).getImagePath())
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .placeholder(R.drawable.placeholder)
                        .listener(new RequestListener<String, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                                Helper.getInstance().Log_error("IMAGE_@", "IMAGE ERROR" + e + " kjhg" + isFirstResource);
                                holder.mTOCImage.setVisibility(View.GONE);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                Helper.getInstance().Log_debug("IMAGE_@", "onResourceReady" + isFirstResource);
                                return false;
                            }
                        })
                        .into(holder.mTOCImage);
            } else {
                /**
                 * Video Url Empty
                 * ***/
                holder.mTOCImage.setVisibility(View.GONE);
                holder.playImg.setVisibility(View.GONE);
                holder.mTOCImage.setImageResource(R.drawable.placeholder_mag);
           // holder.playImg.setVisibility(View.VISIBLE);
            }


    } else {
            loadAd(holder.mAdViewTab, holder.adLayout);
            Log.d("CheckScroll", "onBindViewHolder: " + magazineArticleList.get(position).getViewtype()+"  po " +position);
        }


}

@Override
public int getItemViewType(int position) {
    Log.d("count", "getItemCount: "+position);
    return magazineArticleList.get(position).getViewtype();

}

@Override
public int getItemCount() {

    return magazineArticleList.size();

}

public class TOCHolder extends RecyclerView.ViewHolder {
    private TextView mTitleHeaderTxt, mTitleContenadtTxt, mCategoryTitle, subcat_row_title;
    private ImageView mTOCImage, mLoackImage, gray_arrow, playImg;
    private RelativeLayout contentBaseLayout,adLayout;
    private PublisherAdView mAdViewTab;

    public TOCHolder(View itemView, int viewType) {
        super(itemView);
        if (viewType == CATEGORY) {
            mTitleHeaderTxt = (TextView) itemView.findViewById(R.id.content_row_title);
            mCategoryTitle = (TextView) itemView.findViewById(R.id.txt_category);
            mTOCImage = (ImageView) itemView.findViewById(R.id.header_row_image);
            subcat_row_title = (TextView) itemView.findViewById(R.id.subcat_row_title);
            mLoackImage = (ImageView) itemView.findViewById(R.id.content_row_readimage);
            gray_arrow = (ImageView) itemView.findViewById(R.id.gray_arrow);
            playImg = (ImageView) itemView.findViewById(R.id.play_img);
            contentBaseLayout = (RelativeLayout) itemView.findViewById(R.id.content_root_layout);
            mAdViewTab = (PublisherAdView) itemView.findViewById(R.id.ad_view);
            gray_arrow.setVisibility(View.GONE);
            contentBaseLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    mOnTOCclickListener.onTOCitemClickListener(position, magazineArticleList.get(position).getLockStatus());
                }
            });
        } else {
            mAdViewTab = (PublisherAdView) itemView.findViewById(R.id.ad_view);
            adLayout = (RelativeLayout) itemView.findViewById(R.id.ad_rootView);
        }
    }
}

private void loadAd(final PublisherAdView mAdViewTab, final RelativeLayout adLayout) {
    try {
        if (Helper.isConnected(mContext)) {
            if (Helper.isTablet(HomePage.getInstance())) {

               // adLayout.setVisibility(View.GONE);
            }
           // mAdView.setVisibility(View.VISIBLE);
            PublisherAdRequest adRequest = new PublisherAdRequest.Builder().build();
            mAdViewTab.loadAd(adRequest);


        } else {
            mAdViewTab.setVisibility(View.GONE);
            adLayout.setVisibility(View.GONE);

            notifyDataSetChanged();
        }


    } catch (Exception e) {
        e.printStackTrace();
    }
}


}

Please help, thanks in advance.


Solution

  • This seems to me like you must have set the width or height of the recycleview to 0dp.

    This usually shows up as a warning in android studio.

    Check your xml files.If the recycle view has 0 dp change it to wrap_content or match_parent

    Hope this helps.Good luck