RecyclerView使用如此多的内存直到OOM

时间:2017-01-19 03:25:21

标签: android android-recyclerview recycler-adapter android-memory

打开包含RecyclerView的片段后,“内存”迅速上升。当上下几次sc上,“记忆”继续上升,然后显示OOM和Force Close。 enter image description here

以下是RecyclerView截图:

enter image description here enter image description here

以下是我的适配器代码:

我只使用一个RecyclerView整页并在第一个项目中嵌套GridView;

public class CategoryPagerItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


//热门分类
public static final int VIEW_TYPE_HOT_SUB_CATE = 1;
//banner+商品横滑推荐
public static final int VIEW_TYPE_PROMOTION_LIST = 2;
public static final int VIEW_TYPE_PROMOTION_LIST_LABEL = 3;
//商品集合
public static final int VIEW_TYPE_GOODS_LIST = 4;
//商品集合标签
public static final int VIEW_TYPE_GOODS_LIST_LABEL = 5;
//加载更多
public static final int VIEW_TYPE_GOODS_LIST_MORE = 6;


public static final int COUNT_HOT_SUB_CATE=1;
public static final int COUNT_HOT_GOODS_LIST_LABEL=1;
public static final int COUNT_HOT_GOODS_LIST_MORE=1;

private String mTagId;//TabLayout的title对应的tagid
private String mTitleName;//TabLayout的title对应的name
private int mIndex = -1;//ViewPager的index
private int mLevel = 1;//级别分类

private Context mContext;

//相关的banner+横滑商品
private ArrayList<CategoryList.RelatedTagListEntity> mRelatedTagListEntityList;
//热门分类
private ArrayList<CategoryList.HotSubCategoryListEntity> mHotSubCategoryListEntityList;
//商品列表
private ArrayList<CategoryList.GoodListEntity> mGoodListEntityList;

private int mRelatedTagSize, mGoodsListSize;

private OnGoodsItemClickListener mOnGoodsItemClickListener;

public CategoryPagerItemAdapter(Context context, String tagId, String titleName, int index) {
    mTagId = tagId;
    mTitleName = titleName;
    mIndex = index;
    mContext = context;
}

public void resetData(ArrayList<CategoryList.HotSubCategoryListEntity> hotSubCategoryListEntityList,
                      ArrayList<CategoryList.RelatedTagListEntity> relatedTagListEntityList,
                      ArrayList<CategoryList.GoodListEntity> goodListEntityList, int level) {
    mHotSubCategoryListEntityList = hotSubCategoryListEntityList;
    mRelatedTagListEntityList = relatedTagListEntityList;
    mGoodListEntityList = goodListEntityList;
    mRelatedTagSize = mRelatedTagListEntityList == null ? 0 : mRelatedTagListEntityList.size();
    mGoodsListSize = mGoodListEntityList == null ? 0 : mGoodListEntityList.size();
    mLevel = level;
    notifyDataSetChanged();
}


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    //头部的十个分类
    if (viewType == VIEW_TYPE_HOT_SUB_CATE) {
        return new HotSubCateViewHolder(layoutInflater.inflate(R.layout.category_classify_item_hot_sub_cate, parent, false));
    } else if (viewType == VIEW_TYPE_PROMOTION_LIST) {//banner+商品横滑推荐
        return new PromotionViewHolder(layoutInflater.inflate(R.layout.category_classify_item_related, parent, false));
    } else if (viewType == VIEW_TYPE_GOODS_LIST) {//商品列表
        return new GoodListViewHolder(layoutInflater.inflate(R.layout.category_classify_item_goods_list, parent, false));
    }  else if (viewType == VIEW_TYPE_GOODS_LIST_LABEL) {
        return new GoodListLabelViewHolder(layoutInflater.inflate(R.layout.category_classify_item_goods_list_label, parent, false));
    } else if (viewType == VIEW_TYPE_GOODS_LIST_MORE) {//更多
        return new MoreGoodsListViewHolder(layoutInflater.inflate(R.layout.category_classify_item_more, parent, false));
    }

    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder vh, final int position) {

    switch (vh.getItemViewType()) {
        //热门分类
        case VIEW_TYPE_HOT_SUB_CATE:

            final HotSubCateViewHolder hotSubCateHolder = (HotSubCateViewHolder) vh;
            int horizontalSpacing = (UJiPin.SCREEN_WIDTH - UDensity.dip2px(mContext, 16) * 2 - UDensity.dip2px(mContext, 50) * 5) / 4;
            hotSubCateHolder.mGridview.setHorizontalSpacing(horizontalSpacing);
            hotSubCateHolder.mGridview.setVerticalSpacing(UDensity.dip2px(mContext, 20));
            final CategoryHotSubCateAdapter categoryHotSubCateAdapter = new CategoryHotSubCateAdapter(mContext, mHotSubCategoryListEntityList);
            hotSubCateHolder.mGridview.setAdapter(categoryHotSubCateAdapter);
            hotSubCateHolder.mGridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
                    int hotSubViewType = categoryHotSubCateAdapter.getItemViewType(pos);
                    CategoryList.HotSubCategoryListEntity hotSubCategoryListEntity = mHotSubCategoryListEntityList.get(pos);

                    if (hotSubViewType == CategoryHotSubCateAdapter.VIEW_TYPE_HOT_SUB_CATE) {//热门分类
                        JumpUtils.JumpClassifyList((BaseActivity) mContext, hotSubCategoryListEntity.getLevel(), hotSubCategoryListEntity.getTag_id(), hotSubCategoryListEntity.getName());
                        UJPTrack.getInstance().setTrack((BaseActivity) mContext, UJPTrack.PAGE_CLASS_ + UString.urlEncode(hotSubCategoryListEntity.getName()),
                            "class-1-" + UString.urlEncode(hotSubCategoryListEntity.getName()));
                    } else if (hotSubViewType == CategoryHotSubCateAdapter.VIEW_TYPE_HOT_SUB_CATE_MORE) {//点击more
                        Intent intent = new Intent(mContext, CategoryPagerMoreActivity.class);
                        intent.putExtra(CategoryPagerMoreActivity.EXTRA_STRING_CATEGORY_NAME, mTitleName);
                        intent.putExtra(CategoryPagerMoreActivity.EXTRA_INT_CATEGORY_INDEX, mIndex);
                        intent.putExtra(CategoryPagerMoreActivity.EXTRA_STRING_CATEGORY_TAG_ID, mTagId);
                        mContext.startActivity(intent);
                        UJPTrack.getInstance().setTrack((BaseActivity) mContext,
                            UJPTrack.PAGE_CLASS_ + UString.urlEncode(mTitleName),
                            "class-1-more");
                    }
                }
            });

            break;
        case VIEW_TYPE_PROMOTION_LIST://banner+横滑
            PromotionViewHolder promotionViewHolder = (PromotionViewHolder) vh;
            final int promotionPosition = position - COUNT_HOT_SUB_CATE;

            //防止recyclerview复用出现错乱的办法是有if必须有else,并且处理相反
            GridLayoutManager.LayoutParams promotionLP = (GridLayoutManager.LayoutParams) promotionViewHolder.mContainer.getLayoutParams();
            if (promotionPosition == 0) {//如果是第一个,则显示“相关推荐“
                promotionViewHolder.mLabel.setVisibility(View.VISIBLE);
                promotionLP.setMargins(-UDensity.dip2px(mContext, 5), UDensity.dip2px(mContext, 16), -UDensity.dip2px(mContext, 5), 0);
            } else {
                promotionViewHolder.mLabel.setVisibility(View.GONE);
                promotionLP.setMargins(-UDensity.dip2px(mContext, 5), UDensity.dip2px(mContext, 4), -UDensity.dip2px(mContext, 5), 0);

            }
            promotionViewHolder.mContainer.setLayoutParams(promotionLP);

            final CategoryList.RelatedTagListEntity relatedTagListEntity = mRelatedTagListEntityList.get(promotionPosition);
            FrescoImageLoader.getInstance().load(promotionViewHolder.mCover, relatedTagListEntity.getCover());

            //点击banner
            promotionViewHolder.mCover.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    JumpUtils.JumpActivityTopic((BaseActivity) mContext, relatedTagListEntity.getName(),
                        relatedTagListEntity.getTag_id(), null, promotionPosition);
                    UJPTrack.getInstance().setTrack((BaseActivity) mContext, UJPTrack.PAGE_LABEL_ + UString.urlEncode(relatedTagListEntity.getName()),
                        "class-2-" + covertInt(promotionPosition + 1));
                }
            });
            final CategoryChoiceTagAdapter adapter = new CategoryChoiceTagAdapter(mContext);
            //点击横滑商品
            adapter.setOnItemClickListener(new CategoryChoiceTagAdapter.OnItemClickListener() {
                @Override
                public void onTag4ItemClick(final CategoryList.GoodListEntity goodListEntity, int position, View view) {
                    Jumper.newJumper().putString(GoodsDetailActivity.EXTRA_STRING_GOODID, goodListEntity.getGoods_id() + "")
                        .putString(GoodsDetailActivity.EXTRA_STRING_SOURCENAME, "分类")
                        .putString(GoodsDetailActivity.EXTRA_STRING_SOURCEID, "活动横滑")
                        .jump((BaseActivity) mContext, GoodsDetailActivity.class);
                    UJPTrack.getInstance().setTrack((BaseActivity) mContext, UJPTrack.PAGE_GOOD + goodListEntity.getGoods_id(),
                        "class-2-" + covertInt(promotionPosition + 1));
                }
            });
            promotionViewHolder.mSlideMoreRecycleView.setAdapter(adapter);
            adapter.setDataRefresh(relatedTagListEntity.getGoods_list());
            //横滑
            promotionViewHolder.mSlideMoreRecycleView.setOnSlideTwiceLisner(new SlideMoreRecycleView.SlideTwiceLisner() {
                @Override
                public void onSliding(RecyclerView recyclerView) {
                    JumpUtils.JumpActivityTopic((BaseActivity) mContext, relatedTagListEntity.getName(),
                        relatedTagListEntity.getTag_id(), "", promotionPosition);
                }
            });
            break;
        case VIEW_TYPE_GOODS_LIST_LABEL://商品列表的label
            break;
        case VIEW_TYPE_GOODS_LIST://商品列表
            int goodsListPosition = position - COUNT_HOT_SUB_CATE - mRelatedTagSize - COUNT_HOT_GOODS_LIST_LABEL;
            final CategoryList.GoodListEntity goodListEntity = mGoodListEntityList.get(goodsListPosition);
            final GoodListViewHolder goodsListHolder = (GoodListViewHolder) vh;

            ViewCompat.setTransitionName(goodsListHolder.ivCover, mContext.getString(R.string.transition_name) + position);
            goodsListHolder.rootView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnGoodsItemClickListener != null) {
                        mOnGoodsItemClickListener.onItemClick(goodsListHolder.rootView, goodListEntity, position, goodListEntity.getThumbnail());
                    }
                }
            });
            goodsListHolder.tv_goods_selling_point.setText(goodListEntity.getSelling_point());
            if (!TextUtils.isEmpty(goodListEntity.getThumbnail()))
                FrescoImageLoader.getInstance().load(goodsListHolder.ivCover, goodListEntity.getThumbnail());
            if (!TextUtils.isEmpty(goodListEntity.getMark())) {
                goodsListHolder.ivGroupLogo.setVisibility(View.VISIBLE);
                FrescoImageLoader.getInstance().load(goodsListHolder.ivGroupLogo, goodListEntity.getMark());
            } else {
                goodsListHolder.ivGroupLogo.setVisibility(View.GONE);
            }

            goodsListHolder.tvDescription.setText(goodListEntity.getGoods_name());
            if (!TextUtils.isEmpty(goodListEntity.getGoods_price()))
                goodsListHolder.tvPrice.setText(String.format(mContext.getString(R.string.rmb), goodListEntity.getGoods_price()));
            //售罄
            if (goodListEntity.getProduct_stock_total() <= 0)
                goodsListHolder.ivSoldOut.setVisibility(View.VISIBLE);
            else
                goodsListHolder.ivSoldOut.setVisibility(View.GONE);
            break;
        case VIEW_TYPE_GOODS_LIST_MORE://更多推荐
            MoreGoodsListViewHolder moreGoodsListViewHolder = (MoreGoodsListViewHolder) vh;
            moreGoodsListViewHolder.mContainer.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    JumpUtils.JumpClassifyList((BaseActivity) mContext, mLevel, mTagId, mTitleName);
                    UJPTrack.getInstance().setTrack((BaseActivity) mContext, UJPTrack.PAGE_CLASS_ + UString.urlEncode(mTitleName), UJPTrack.PAGE_CLASS_CLASS + UString.urlEncode(mTitleName));
                }
            });
            break;
    }
}

@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
    super.onViewRecycled(holder);
}

@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return VIEW_TYPE_HOT_SUB_CATE;
    } else if (position < COUNT_HOT_SUB_CATE + mRelatedTagSize) {
        return VIEW_TYPE_PROMOTION_LIST;
    } else if (position < COUNT_HOT_SUB_CATE + mRelatedTagSize + COUNT_HOT_GOODS_LIST_LABEL) {
        return VIEW_TYPE_GOODS_LIST_LABEL;
    } else if (position < COUNT_HOT_SUB_CATE + mRelatedTagSize + COUNT_HOT_GOODS_LIST_LABEL + mGoodsListSize) {
        return VIEW_TYPE_GOODS_LIST;
    } else {
        return VIEW_TYPE_GOODS_LIST_MORE;
    }
}

@Override
public int getItemCount() {
    return mGoodsListSize + mRelatedTagSize + COUNT_HOT_SUB_CATE +
        COUNT_HOT_GOODS_LIST_LABEL + COUNT_HOT_GOODS_LIST_MORE;
}


//头部的热门分类
private static class HotSubCateViewHolder extends RecyclerView.ViewHolder {

    private MyGridview mGridview;

    HotSubCateViewHolder(View view) {
        super(view);
        mGridview = (MyGridview) view.findViewById(R.id.grid_view);
    }
}


//banner+推荐横滑
private static class PromotionViewHolder extends RecyclerView.ViewHolder {

    private SimpleDraweeView mCover;
    private LinearLayout mContainer;
    private TextView mLabel;
    private SlideMoreRecycleView mSlideMoreRecycleView;

    PromotionViewHolder(View view) {
        super(view);
        mContainer = (LinearLayout) view.findViewById(R.id.ll);
        mLabel = (TextView) view.findViewById(R.id.label);
        mCover = (SimpleDraweeView) view.findViewById(R.id.iv_cover);
        mSlideMoreRecycleView = (SlideMoreRecycleView) view.findViewById(rv_tag_list);
    }
}

//商品列表
private static class GoodListViewHolder extends RecyclerView.ViewHolder {
    View rootView;
    SimpleDraweeView ivCover;
    TextView tvDescription;
    TextView tvPrice;
    TextView tv_goods_selling_point;
    ImageView ivSoldOut;
    SimpleDraweeView ivGroupLogo;

    GoodListViewHolder(View v) {
        super(v);
        rootView = v;
        ivCover = (SimpleDraweeView) v.findViewById(R.id.iv_cover);
        tvDescription = (TextView) v.findViewById(R.id.tv_descrption);
        tvPrice = (TextView) v.findViewById(R.id.tv_price);
        tv_goods_selling_point = (TextView) v.findViewById(R.id.tv_goods_selling_point);
        ivSoldOut = (ImageView) v.findViewById(R.id.iv_sold_out);
        ivGroupLogo = (SimpleDraweeView) v.findViewById(R.id.iv_group_tag);
    }
}

private static class GoodListLabelViewHolder extends RecyclerView.ViewHolder {
    TextView mLabel;

    public GoodListLabelViewHolder(View itemView) {
        super(itemView);
        mLabel = (TextView) itemView.findViewById(R.id.label);
    }
}



private static class MoreGoodsListViewHolder extends RecyclerView.ViewHolder {

    private LinearLayout mContainer;

    MoreGoodsListViewHolder(View itemView) {
        super(itemView);
        mContainer = (LinearLayout) itemView.findViewById(R.id.container);
    }
}

//点击双栏列表接口
public interface OnGoodsItemClickListener {
    void onItemClick(View rootView, CategoryList.GoodListEntity goodListEntity, int position, String imageUrl);
}

public void addOnGoodsItemClickListener(OnGoodsItemClickListener listener) {
    mOnGoodsItemClickListener = listener;
}

public String covertInt(int value) {
    return value <= 9 ? ("0" + value) : value + "";
}

0 个答案:

没有答案