我知道这听起来有点疯狂,但我的平板电脑 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_content
或 match_parent
希望这有帮助。祝你好运
关于android - 平板电脑中的 Recyclerview 在 Lollipop 或更低版本的设备上被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44427181/