ViewPager 可回收的adapter
来源:互联网 发布:常用的数据库 编辑:程序博客网 时间:2024/04/27 14:18
虽说 ViewPager 以及 提供了 缓存的机制,
可以通过 mViewPager.setOffscreenPageLimit(4);
来设置缓存的页数
当然 还有一些特殊情况 为了性能的考略, 需要 回收一些View
而不是每次 缓存一页数据 都是从新加载.
其实也是 模仿ListView 的 holder 来缓存View 的
直接看代码吧:
public class RecommendViewPageAdapter extends PagerAdapter { public static final String TAG = "RecommendViewPageAdapter"; private Context mContext; private List<TopicModel> mTopicModels; private List<ViewHolder> mViewHolderList = new ArrayList<>(); public RecommendViewPageAdapter(Context context, List<TopicModel> models) { mContext = context; mTopicModels = models; } @Override public int getCount() { return mTopicModels.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == ((ViewHolder) object).itemView; } @Override public Object instantiateItem(ViewGroup container, int position) { final ViewHolder viewHolder; if (mViewHolderList.size() > 0) { viewHolder = mViewHolderList.get(0); mViewHolderList.remove(0); } else { final View item = LayoutInflater.from(mContext).inflate(R.layout.recommend_view_pager_item, null); viewHolder = new ViewHolder(item); } final TopicModel headerTopic = mTopicModels.get(position); viewHolder.mCoverImg.setImageURI(headerTopic.getBigCoverUri()); viewHolder.mTitleTxt.setText(headerTopic.getTitle()); viewHolder.mRankingTxt.setText(mContext.getResources().getString(R.string.ranking_count, headerTopic.getArticleNum())); viewHolder.mFollowTxt.setText(mContext.getResources().getString(R.string.followed, headerTopic.getFollowUserNum())); viewHolder.mTagsLinearLayout.removeAllViews(); for (int i = 0, z = headerTopic.getTagModelList().size(); i < z; i++) { TextView tagTxtView = TagViewUtil.getTagTxtView(mContext);// tagTxtView.setText("标签"); int padding = mContext.getResources().getDimensionPixelOffset(R.dimen.item_padding_micro); int autoPadding = AutoUtils.scaleValue(padding); AutoWrapLinearLayout.LayoutParams layoutParams = new AutoWrapLinearLayout.LayoutParams(autoPadding, autoPadding); tagTxtView.setText(headerTopic.getTagModelList().get(i).getTag()); viewHolder.mTagsLinearLayout.addView(tagTxtView, layoutParams); } container.addView(viewHolder.itemView, -1, null); if (mOnItemClickListener != null) { viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(viewHolder.itemView, headerTopic, position); } }); } return viewHolder; } public static class ViewHolder { public View itemView; @Bind(R.id.img_cover) SimpleDraweeView mCoverImg; @Bind(R.id.txt_title) TextView mTitleTxt; @Bind(R.id.tags_box) AutoWrapLinearLayout mTagsLinearLayout; @Bind(R.id.txt_ranking) TextView mRankingTxt; @Bind(R.id.txt_follow) TextView mFollowTxt; public ViewHolder(View itemView) { this.itemView = itemView; ButterKnife.bind(this, itemView); } } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public void destroyItem(ViewGroup container, int position, Object object) { LogUtil.d(TAG, "destroyItem position = " + position + " , obj = " + object); ViewHolder viewHolder = (ViewHolder) object; (container).removeView(viewHolder.itemView); mViewHolderList.add(viewHolder); container.removeView(viewHolder.itemView); } OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } public interface OnItemClickListener { void onClick(View view, TopicModel headerTopic, int position); }}
在 destroyItem 方法中 把View 缓存
然后 instantiateItem 放在中 判断是否有缓存的View 有的话 重复利用
还有一点需要注意的是:
getItemPosition 方法 返回 POSITION_NONE,
再调用 adapter.notifyDataSetChanged() 时 才会 刷新整个ViewPager 会 destroy 调用所有Item 然后从新加载
关于 为什么返回 POSITION_NONE 可以产考 这片文章:
http://www.cnblogs.com/maoyu417/p/3740209.html
0 0
- ViewPager 可回收的adapter
- ViewPager的adapter
- ViewPager的Adapter
- ViewPager的adapter
- viewpager轮播图的adapter
- ViewPager的Adapter总结
- ViewPager的adapter
- (viewpager)adapter的创建
- 可回收序号产生器的产生
- ViewPager的Adapter中视图重用
- viewPager的adapter数据不更新
- ViewPager 和 Adapter
- ViewPager之Adapter
- TabLayout+ViewPager+Adapter
- 解决Fragment中放置ViewPager,不执行adapter的方法
- 【Android开发笔记】viewpager+fragment对adapter的选择
- Android viewpager 切换adapter内存溢出的问题
- ViewPager刷新数据,动态更改adapter的数量
- 自动化测试_学习笔记
- PHP 变量与常量
- 标题栏的滚动
- 2015-12-09 sql复习
- webgl 第四天学习
- ViewPager 可回收的adapter
- Introduction to Recommender System 之 Module 6 Item-Item Collaborative Filtering
- hdu 5438 +hdu 4786 并查集
- 正则表达式匹配邮箱
- Android PopupWindow详解
- 如何使用命令进行Mac和Linux之间的文件传输
- android动态加载布局文件示例
- 最新 Google V8 编译 (2015-12-09)
- Activity的生命周期