android - 平板电脑中的 Recyclerview 在 Lollipop 或更低版本的设备上被多次调用

标签 android android-recyclerview adapter tablet

我知道这听起来有点疯狂,但我的平板电脑 recyclerview 适配器对于不同的 Android 版本表现不同。在我的棉花糖平板电脑中,它工作正常,即它仅加载屏幕上可见的 View ,并且仅在滚动完成时加载其余 View 。

但是当使用其他 Android 版本( Lollipop 及以下版本)进行测试时,它似乎会加载数组中的每个 View ,而无需滚动回收器 View 。整个数组加载了 4 或 5 次,但没有执行任何操作。

这会导致我的应用程序在这些设备中滚动时卡住。

我不认为代码有问题,因为它在棉花糖片中完美运行。

谁能告诉我问题可能是什么?

我希望我的问题足够清楚。

这是我的适配器代码,以防万一。

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();
    }
}


}

请帮忙,提前致谢。

最佳答案

在我看来,您必须将 recycleview 的宽度或高度设置为 0dp。

这通常在 android studio 中显示为警告。

检查您的 xml 文件。如果回收 View 的 dp 为 0,请将其更改为 wrap_contentmatch_parent

希望这有帮助。祝你好运

关于android - 平板电脑中的 Recyclerview 在 Lollipop 或更低版本的设备上被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44427181/

相关文章:

android - 单击推送通知android后打开 Activity

Android AppBarLayout 将 ViewPager 下推

java - Switch 语句未返回正确的值

android - 在 RecyclerView 中使用 Urls 显示包含图像的 ParseFile

android - 从 Intent 处理程序提交 fragment 事务时出错

java - 如何以编程方式查看 android 中 zip 中的内容(无需解压缩)

android - 在 RecyclerView Adapter 中使用带有 Activity 作为参数的方法

java - 实现可垂直和水平滚动的列表

android - 网格回收器 View ,子 wrap_content

android - 如何在回收站 View 行中添加动态 View