您的位置:首页技术文章
文章详情页

android - viewpager+Fragment(含有recyclerview+viewpager)低端的机子切换页面滑动的时候明显的卡顿

浏览:47日期:2024-09-04 17:06:04

问题描述

页面类型一:红框是个Fragment,头部是一张大图,下面都是为两列的图,用的是recyclerview实现android - viewpager+Fragment(含有recyclerview+viewpager)低端的机子切换页面滑动的时候明显的卡顿

页面类型二:红框是个Fragment,头部是无线循环轮播,下面是栏目,用的是recyclerview实现android - viewpager+Fragment(含有recyclerview+viewpager)低端的机子切换页面滑动的时候明显的卡顿

页面类型二:红框是个Fragment,头部是无线循环轮播,下面是两列图,用的是recyclerview实现android - viewpager+Fragment(含有recyclerview+viewpager)低端的机子切换页面滑动的时候明显的卡顿

首页进来就是10个页面(viewpager+Fragment),滑动切换页面的时候低端机子会明显卡顿,配置好的手机,如果快速滑动切换也不是那么流畅下面贴代码:public class HomeContentItemFragment extends BaseFragment {

public static final String MODEL = 'model';public static final String TYPE = 'type_show';public static final String ISFIRSTPAGER = 'isFirstPager';// 安利电台public final static int AUDIO_ID = 999999998; //点击“听见安利”的idpublic final static int SUBJECT_ID = 7; //点击“主题专区”的idprivate final int RECOMMEND_ID = 100;// navId=100为推荐idprivate NavModel navModel;private List<VideoModel> videoList;private List<VideoModel> contentVideoList1,heardVideoList;private List<HomeContentVideoInfo> contentVideoList2;private ImageLoader imgImageLoader;private ImageView empty;private PtrClassicFrameLayout refreshLayout;private int TYPE_SHOW;//0默认头部轮播页面,1为单张大图页面,-1为含有二三级页面private RecyclerView recyclerView;private ContentItemAdapter_recylerview adapter_recylerview;

public static HomeContentItemFragment newInstance(NavModel navModel,boolean isFirstPager,int TYPE_SHOW){ HomeContentItemFragment fragment = new HomeContentItemFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(MODEL, navModel); bundle.putBoolean(ISFIRSTPAGER, isFirstPager); bundle.putInt(TYPE,TYPE_SHOW); fragment.setArguments(bundle); return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);}private boolean isLogin;@Overrideprotected void initData(){ videoList=new ArrayList<VideoModel>(); imgImageLoader = ImageLoader.getInstance(); navModel = getArguments() != null ? (NavModel) getArguments().getSerializable(MODEL) : null; TYPE_SHOW=getArguments() != null ? getArguments().getInt(TYPE) : 0; isLogin = !UserDBUtil.getInstance(getApplicationContext()).isNeedLogin();

}private int navId;public void initVideoList(){if (navModel != null){ navId= (int) navModel.getNavId(); videoList.clear(); if (navModel.getNavId() == RECOMMEND_ID) {videoList = VideoDBUtil.getRecomendVideo(navModel.getNavId(), isLogin,getApplicationContext()); } else if (navModel.getNavId() == AUDIO_ID) {videoList = VideoDBUtil.getAudioVideo(isLogin,getApplicationContext()); } else if (navModel.getNavId() == SUBJECT_ID) {videoList = VideoDBUtil.getSubjectVideo(isLogin,getApplicationContext()); } else {videoList = VideoDBUtil.getCategoryVideo(navModel.getNavId(), isLogin,getApplicationContext()); }}if (videoList == null){ videoList = new ArrayList<VideoModel>();} //内容是显示类型1 if(TYPE_SHOW==0||TYPE_SHOW==1){if(videoList!=null&&videoList.size()>0){ heardVideoList=new ArrayList<VideoModel>(); contentVideoList1=new ArrayList<VideoModel>(); for (int i=0;i<videoList.size();i++) {switch (TYPE_SHOW){ case 0:if(i<3){ heardVideoList.add(videoList.get(i));} else { contentVideoList1.add(videoList.get(i));}break; case 1:if(i<1){ heardVideoList.add(videoList.get(i));} else { contentVideoList1.add(videoList.get(i));}break;} }} } //内容是显示类型2(含有下级菜单) if(TYPE_SHOW==-1){boolean haveThree=false;if(videoList.size()<=0){ List<NavModel> modelList=new ArrayList<NavModel>(); List<NavModel> modelList_2=new Select().from(NavModel.class).where(VideoDBConstant.VALID + ' = 1 and parent_id = ?',navModel.getNavId()).orderBy(VideoDBConstant.ORDER_ID + ' ASC').execute(); modelList.addAll(modelList_2); for (int j=0;j<modelList_2.size();j++){List<NavModel> modelList_3=new Select().from(NavModel.class).where(VideoDBConstant.VALID + ' = 1 and parent_id = ?',modelList_2.get(j).getNavId()).orderBy(VideoDBConstant.ORDER_ID + ' ASC').execute();modelList.addAll(modelList_3);if(modelList_3.size()>0){ haveThree=true;} } String str=''; if(haveThree){str='( valid= 1 and t_a_order != 0 and cId = '+modelList.get(0).getNavId()+' )' ;for (int k=1;k<modelList.size();k++){ str=str+' or ( valid= 1 and t_a_order != 0 and cId = '+modelList.get(k).getNavId()+' )';}videoList =new Select().from(VideoModel.class).where(str).orderBy('t_a_order ASC').execute();if(videoList.size()<3){ str='( valid= 1 and t_a_order = 0 and cId = '+modelList.get(0).getNavId()+' )' ; for (int k=1;k<modelList.size();k++){str=str+' or ( valid= 1 and t_a_order = 0 and cId = '+modelList.get(k).getNavId()+' )'; } List<VideoModel> videoModelList =new Select().from(VideoModel.class).where(str).orderBy('t_a_order ASC').execute(); for (int i=0;i<videoModelList.size();i++){videoList.add(videoModelList.get(i));if(videoList.size()>=3){ break;} }} }else {str='( valid= 1 and a_order != 0 and cId = '+modelList.get(0).getNavId()+' )' ;for (int k=1;k<modelList.size();k++){ str=str+' or ( valid= 1 and a_order != 0 and cId = '+modelList.get(k).getNavId()+' )';}videoList =new Select().from(VideoModel.class).where(str).orderBy('a_order ASC').execute();if(videoList.size()<3){ str='( valid= 1 and a_order = 0 and cId = '+modelList.get(0).getNavId()+' )' ; for (int k=1;k<modelList.size();k++){str=str+' or ( valid= 1 and a_order = 0 and cId = '+modelList.get(k).getNavId()+' )'; } List<VideoModel> videoModelList =new Select().from(VideoModel.class).where(str).orderBy('a_order ASC').execute(); for (int i=0;i<videoModelList.size();i++){videoList.add(videoModelList.get(i));if(videoList.size()>=3){ break;} }} }}heardVideoList=new ArrayList<VideoModel>();for (int i=0;i<videoList.size()&&i<3;i++){ heardVideoList.add(videoList.get(i));}if(navModel!=null){contentVideoList2=VideoDBUtil.getHomeContentVideo(navModel,1);} }

}

@Overrideprotected View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ final View view = inflater.inflate(R.layout.fragment_home_content_item, container, false); refreshLayout= (PtrClassicFrameLayout) view.findViewById(R.id.refresh_layout); recyclerView= (RecyclerView) view.findViewById(R.id.recyclerView); empty= (ImageView) view.findViewById(R.id.emptydate); refreshLayout.setLastUpdateTimeRelateObject(this); refreshLayout.setPtrHandler(new PtrHandler() {@Overridepublic boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);}@Overridepublic void onRefreshBegin(PtrFrameLayout frame) { new Thread(new Runnable() {@Overridepublic void run() { refreshData();} }).start();} }); if(TYPE_SHOW==-1){recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {outRect.left = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10);outRect.right = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10);if(parent.getChildLayoutPosition(view)==0){ outRect.top = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_5);} }}); } else { GridLayoutManager gridLayoutManager=new GridLayoutManager(context,2,LinearLayoutManager.VERTICAL, false); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) { if(position==0){return 2; } return 1;} }); recyclerView.setLayoutManager(gridLayoutManager); recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_5); outRect.right = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_5); outRect.bottom = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_5); outRect.top=getResources().getDimensionPixelSize(R.dimen.recyclerview_item_5); if(parent.getChildLayoutPosition(view)!=0){ if(parent.getChildLayoutPosition(view)%2==0){//右边小图outRect.right=getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10); }else {//左边小图outRect.left=getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10); } }else {outRect.left = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10);outRect.right = getResources().getDimensionPixelSize(R.dimen.recyclerview_item_10); }} }); } adapter_recylerview=new ContentItemAdapter_recylerview(null,null,null,getApplicationContext(),imgImageLoader,navId,TYPE_SHOW); recyclerView.setAdapter(adapter_recylerview); return view;}

@Overrideprotected void initWidgetActions(){ imgImageLoader = ImageLoader.getInstance(); adapter_recylerview.setOnItemClickListener(new ContentItemAdapter_recylerview.MyItemClickListener() {@Overridepublic void onItemClick(VideoModel videoModel) { onMyItemClick(videoModel);} }); MyAsyncTask asyncTask=new MyAsyncTask(); asyncTask.execute();}public void showData(){ if(videoList.size()==0){empty.setVisibility(View.VISIBLE); } adapter_recylerview.setVideoList(contentVideoList1, contentVideoList2, heardVideoList);}

@Overrideprotected void lazyLoad() { if(navModel==null){return; } if(SettingDBUtil.getInstance(getApplicationContext()).isHomeFirstOpen()&&navModel.getTitle().equals('健康')){BusProvider.getInstance().post(new ShowHelp());SettingDBUtil.getInstance(getApplicationContext()).setHomeFirstOpen(false); }}private void onMyItemClick(VideoModel videoModel){ if (videoModel.getType() == CommonConstant.TOPIC_TYPE) {Intent intent = new Intent(getActivity(), MyListActivity.class);intent.putExtra(MyListActivity.TYPE, MyListActivity.ActivtyType.TOPIC);intent.putExtra(TopicFragment.TOPIC_ID, videoModel.getVideoId());intent.putExtra(MyListActivity.TITLE, videoModel.getTitle());startActivity(intent); } else if (videoModel.getType() == CommonConstant.VIDEO_ON_LIVE_TYPE) {try{ if (NetWorkHelper.isNetworkAvailable(getActivity())) {if (NetWorkHelper.isWifiDataEnable(getActivity())){ Intent intent = new Intent(getActivity(), VideoOnLive.class); intent.putExtra(VideoDetailActivity.VIDEO_ID, videoModel.getVideoId() + ''); intent.putExtra(VideoDetailActivity.WEB_URL, videoModel.getWebUrl()); startActivity(intent); getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.no_anim);} else{ Hook(videoModel.getVideoId() + '', videoModel.getWebUrl());} } else {Toast.makeText(getApplicationContext(), '没有网络,无法观看视频。', Toast.LENGTH_LONG).show(); }} catch (Exception e){ // TODO Auto-generated catch block e.printStackTrace();} } else {Intent intent = new Intent(getActivity(), VideoDetailActivity.class);intent.putExtra(VideoDetailActivity.VIDEO_ID, videoModel.getVideoId());startActivity(intent);getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.no_anim); }}private void Hook(final String videoId, final String webUrl){ Builder builder = new Builder(getActivity()); builder.setMessage('温馨提示:非Wi-fi环境下,播放视频会消耗较多流量!'); builder.setPositiveButton('继续播放', new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton){ dialog.dismiss(); Intent intent = new Intent(getActivity(), VideoOnLive.class); intent.putExtra(VideoDetailActivity.VIDEO_ID, videoId); intent.putExtra(VideoDetailActivity.WEB_URL, webUrl); startActivity(intent); getActivity().overridePendingTransition(R.anim.push_left_in, R.anim.no_anim);} }); builder.setNegativeButton('暂不播放', new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss();} }); builder.show();}

private void refreshData() { Long lastLoadDataTime = SettingDBUtil.getInstance(context).getLastRefreshDataTime(); final long currentTime=System.currentTimeMillis(); RequestParams params = new RequestParams(VideoConstant.NEW_DATA_REFRESH +lastLoadDataTime); x.http().get(params, new Callback.CommonCallback<String>() {@Overridepublic void onSuccess(final String result) { Toast.makeText(getApplicationContext(),'更新成功',Toast.LENGTH_SHORT).show(); if (result != null && result.trim().length() > 10) {new Thread(new Runnable() { @Override public void run() {saveData(result); }}).start();SettingDBUtil.getInstance(context).setRefreshDataTime(currentTime); }}@Overridepublic void onError(Throwable ex, boolean isOnCallback) { Toast.makeText(getApplicationContext(),'更新失败',Toast.LENGTH_SHORT).show();}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() { refreshLayout.refreshComplete();} });}private void saveData(String result) { JSONObject obj = null; JSONArray videoArr = null; try {obj = new JSONObject(result);videoArr = obj.optJSONArray(VideoConstant.VIDEOLIST); } catch (JSONException e) { } if (videoArr != null) {ActiveAndroid.beginTransaction();try { for (int i = 0, videoLen = videoArr.length(); i < videoLen; i++) {VideoModel videoModel = new VideoModel();JSONObject navObj = videoArr.optJSONObject(i);videoModel.setVideoId(navObj.optLong(VideoConstant.ID));videoModel.setType(navObj.optInt(VideoConstant.TYPE));videoModel.setClicked(false);videoModel.setTitleUpload(navObj.optString(VideoConstant.TITLE_UPLOAD));videoModel.setrOrder(navObj.optInt(VideoConstant.RORDER));videoModel.setrId(navObj.optInt(VideoConstant.RID));videoModel.setcId(navObj.optInt(VideoConstant.CID));videoModel.setcOrder(navObj.optInt(VideoConstant.CORDER));videoModel.settId(navObj.optInt(VideoConstant.TID));videoModel.settOrder(navObj.optInt(VideoConstant.TORDER));videoModel.setTitle(navObj.optString(VideoConstant.TITLE));videoModel.setValid(navObj.optInt(VideoConstant.VALID));videoModel.setDetail(navObj.optString(VideoConstant.DETAIL));videoModel.setWebUrl(navObj.optString(VideoConstant.WEBURL));videoModel.setExpireDate(navObj.optInt(VideoConstant.EXPIREDATE));videoModel.setShootDate(navObj.optLong(VideoConstant.SHOOTDATE));videoModel.setIsVip(navObj.optInt(VideoConstant.IS_VIP));videoModel.setRole(navObj.optString(VideoConstant.ROLE));videoModel.setPermission(navObj.optInt(VideoDBConstant.PERMISSION));videoModel.setTags(navObj.optString(VideoConstant.TAGS));videoModel.setPicDate(navObj.optLong(VideoConstant.PICDATE));videoModel.setSign(navObj.optInt(VideoConstant.SIGN));videoModel.setaOrder(navObj.optInt(VideoDBConstant.A_ORDER));videoModel.settAOrder(navObj.optInt(VideoDBConstant.T_A_ORDER));try { VideoDBUtil.deleteVideo(videoModel.getVideoId());} catch (Exception e) { e.printStackTrace();}if (videoModel.getRole() == null || videoModel.getRole().trim().length() == 0) { videoModel.setRole(VideoConstant.NULL);}videoModel.save(); } ActiveAndroid.setTransactionSuccessful();}catch(Exception e) {}finally { ActiveAndroid.endTransaction();}getActivity().runOnUiThread(new Runnable() { @Override public void run() {BusProvider.getInstance().post(new RefreshEvent(navModel.getParent_id()));//通知更新数据 }}); }}

@Subscribepublic void scrollTop(ContentScrollTopEvent contentScrollTopEvent){ if(recyclerView!=null){recyclerView.smoothScrollToPosition(0); }}

@Overridepublic void onDestroy() { super.onDestroy(); if(adapter_recylerview!=null){adapter_recylerview.cancelTimer(); }}@Overridepublic void onResume() { super.onResume(); BusProvider.getInstance().register(this);}@Overridepublic void onPause() { super.onPause(); try {BusProvider.getInstance().unregister(this);//注销 }catch (Exception e){}}class MyAsyncTask extends AsyncTask { @Override protected Object doInBackground(Object[] params) {initVideoList();return null; } @Override protected void onPostExecute(Object o) {showData();super.onPostExecute(o); }}

}

这是适配器代码:public class ContentItemAdapter_recylerview extends RecyclerView.Adapter {

public final static int AUDIO_ID = 999999998; //点击“听见安利”的idpublic final static int SUBJECT_ID = 7; //点击“主题专区”的idprivate List<VideoModel> contentVideoModelList1, contentVideoList, heardVideoList;private List<HomeContentVideoInfo> contentVideoModelList2;private Context context;protected DisplayImageOptions mOptions;protected ImageLoader mImageLoader;private int TYPE_SHOW = 0;//0默认头部轮播页面,1为单张大图页面,-1为含有二三级页面private static final int TYPE_CONTENT = 0;private static final int TYPE_HEADER = 1;private int listSize;

public ContentItemAdapter_recylerview(List<VideoModel> contentVideoModelList1, List<HomeContentVideoInfo> contentVideoModelList2, List<VideoModel> heardVideoList, Context context, ImageLoader mImageLoader, long navId, int TYPE_SHOW) { this.contentVideoModelList1 = contentVideoModelList1; this.contentVideoModelList2 = contentVideoModelList2; this.heardVideoList = heardVideoList; this.context = context; this.mImageLoader = mImageLoader; this.navId = navId; this.TYPE_SHOW = TYPE_SHOW; mOptions = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.default_pic).showImageOnLoading(R.drawable.default_pic) .resetViewBeforeLoading(true).cacheInMemory(false).cacheOnDisc(true).imageScaleType(ImageScaleType.EXACTLY) .bitmapConfig(Bitmap.Config.RGB_565).displayer(new SimpleBitmapDisplayer()).build();}//搜索关键字private String keyword;protected long navId;private MyItemClickListener mItemClickListener;@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_CONTENT) {if (TYPE_SHOW == 0 || TYPE_SHOW == 1) { return new ContentViewHolder1(View.inflate(context, R.layout.view_content_item, null));} else if (TYPE_SHOW == -1) { return new ContentViewHolder2(View.inflate(context, R.layout.view_home_content_item, null));} } else if (viewType == TYPE_HEADER) {if (TYPE_SHOW == 0 || TYPE_SHOW == -1) { return new HeaderViewHolderWithViewPager(View.inflate(context, R.layout.home_content_item_header, null));} else if (TYPE_SHOW == 1) { return new HeaderViewHolderWithImager(View.inflate(context, R.layout.view_content_home_header, null));} } return null;}@Overridepublic int getItemViewType(int position) { if (position == 0 && (heardVideoList == null ? false : heardVideoList.size() > 0 ? true : false)) {return TYPE_HEADER; } return TYPE_CONTENT;}public void setOnItemClickListener(MyItemClickListener listener) { this.mItemClickListener = listener;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //头部显示--单张大图 if (holder instanceof HeaderViewHolderWithImager) {showHeaderViewWithImager((HeaderViewHolderWithImager) holder, heardVideoList.get(0)); } //头部显示--轮播 if (holder instanceof HeaderViewHolderWithViewPager) {showHeaderViewWithViewPager((HeaderViewHolderWithViewPager) holder); } //头部以下内容显示--类型1 if (holder instanceof ContentViewHolder1) {VideoModel videoModel = contentVideoModelList1.get(heardVideoList == null ? position : heardVideoList.size() > 0 ? position - 1 : position);showContentView1((ContentViewHolder1) holder, videoModel);if (!MyImageLoader.isMemoryCache(context, StorageHelper.getListSmallImgUrl(videoModel), ((ContentViewHolder1) holder).img, mImageLoader)) { mImageLoader.displayImage(StorageHelper.getListSmallImgUrl(videoModel), ((ContentViewHolder1) holder).img, mOptions);} } //头部以下内容显示--类型2 if (holder instanceof ContentViewHolder2) {showContentView2((ContentViewHolder2) holder, heardVideoList == null ? position : heardVideoList.size() > 0 ? position - 1 : position); }}public void setVideoList(List<VideoModel> contentVideoModelList1, List<HomeContentVideoInfo> contentVideoModelList2, List<VideoModel> heardVideoList) { this.contentVideoModelList1 = contentVideoModelList1; this.contentVideoModelList2 = contentVideoModelList2; this.heardVideoList = heardVideoList; notifyDataSetChanged();}

@Overridepublic int getItemCount() { listSize = 0; switch (TYPE_SHOW) {case 0: listSize = heardVideoList == null ? 0 : heardVideoList.size() > 0 ? 1 : 0; listSize = contentVideoModelList1 == null ? listSize : listSize + contentVideoModelList1.size(); break;case 1: listSize = heardVideoList == null ? 0 : 1; listSize = contentVideoModelList1 == null ? listSize : listSize + contentVideoModelList1.size(); break;case -1: listSize = heardVideoList == null ? 0 : heardVideoList.size() > 0 ? 1 : 0; listSize = contentVideoModelList2 == null ? listSize : listSize + contentVideoModelList2.size(); break; } return listSize;}

/** * @function 头部--单张大图——SHOW_DATA * @author mootor * created at 2016/8/16 17:32 */private HomeContentItemAdsAdapter homeContentItemAdsAdapter;private Timer timer;private TimerTask task;private int currentItemPosition = 0;private void showHeaderViewWithImager(HeaderViewHolderWithImager holder, VideoModel model) { holder.text.setText(model.getTitle()); holder.audioImg.setVisibility(View.GONE); if (model.getType() == CommonConstant.TOPIC_TYPE) {holder.topicImg.setVisibility(View.VISIBLE); } else {holder.topicImg.setVisibility(View.GONE);if (model.getIsVip() == 1 /*&& !UserDBUtil.getInstance(context).isNeedLogin()*/) {// vip holder.topicImg.setImageResource(R.drawable.corner_vip); holder.topicImg.setVisibility(View.VISIBLE);}if (StorageHelper.isAudioRes(model)) { holder.audioImg.setVisibility(View.VISIBLE);} } if (model.isClicked()) {holder.newVideoImg.setVisibility(View.GONE); } else {holder.newVideoImg.setVisibility(View.VISIBLE); } if (!MyImageLoader.isMemoryCache(context, StorageHelper.getListBigImgUrl(model), holder.img, mImageLoader)) {mImageLoader.displayImage(StorageHelper.getListBigImgUrl(model), holder.img, mOptions); }}

/** * @function 头部--轮播——SHOW_DATA * @author mootor * created at 2016/8/16 18:25 */private void showHeaderViewWithViewPager(final HeaderViewHolderWithViewPager holder) { if (homeContentItemAdsAdapter == null) {homeContentItemAdsAdapter = new HomeContentItemAdsAdapter(context, heardVideoList, mImageLoader);holder.viewPager.removeAllViews();holder.viewPager.setAdapter(homeContentItemAdsAdapter);initDots(holder);//初始化指示器homeContentItemAdsAdapter.setOnItemClickListener(new MyItemClickListener() { @Override public void onItemClick(VideoModel videoModel) {if (mItemClickListener != null) { mItemClickListener.onItemClick(videoModel);} }});holder.viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) {currentItemPosition = position;if (heardVideoList.size() < 1) { return;}updateIntroAndDot(holder); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { }});if (heardVideoList.size() > 1) { holder.topAdTextView.setText(heardVideoList.get(0).getTitle()); //计时轮播 if (timer == null) {timer = new Timer(); } if (task == null) {task = new TimerTask() { public void run() {if (holder.viewPager != null) holder.viewPager.post(new Runnable() {@Overridepublic void run() { holder.viewPager.setCurrentItem(currentItemPosition + 1);} }); }};timer.schedule(task, 2000, 2000); }} }}public void cancelTimer(){ if(timer!=null){ timer.cancel(); }}

/** * @function 头部以下内容——类型1——SHOW_DATA * @author mootor * created at 2016/8/16 18:25 */protected void showContentView1(ContentViewHolder1 holder, VideoModel model) { SpannableStringBuilder textString = null; keyword = Valuepass.newInstance().getKeywordsearch(); if (keyword != null) {textString = TextUtilTools.highlight(model.getTitle(), keyword); } else {textString = new SpannableStringBuilder(model.getTitle()); } holder.text.setText(textString); holder.audioImg.setVisibility(View.GONE); holder.topicImg.setVisibility(View.GONE); if (navId != AUDIO_ID && navId != SUBJECT_ID) {if (model.getIsVip() == 1 /*&& !UserDBUtil.getInstance(context).isNeedLogin()*/) {// vip holder.topicImg.setImageResource(R.drawable.corner_vip); holder.topicImg.setVisibility(View.VISIBLE);} else if (StorageHelper.isAudioRes(model)) {// 音频 holder.audioImg.setVisibility(View.VISIBLE);} else if (model.getType() == CommonConstant.TOPIC_TYPE) {// topic holder.topicImg.setImageResource(R.drawable.home_topic); holder.topicImg.setVisibility(View.VISIBLE);} } if (model.isClicked()) {holder.newVideoImg.setVisibility(View.GONE); } else {holder.newVideoImg.setVisibility(View.VISIBLE); }}

/** * @function 头部以下内容——类型2——SHOW_DATA * @author mootor * created at 2016/8/17 11:51 */private void showContentView2(final ContentViewHolder2 holder, final int position) { if (contentVideoModelList2.get(position).getVideoModelList().size() >= 1) {holder.content_layout.setVisibility(View.VISIBLE);holder.contentLayout1.setVisibility(View.VISIBLE);updateHolder(holder, contentVideoModelList2.get(position).getVideoModelList().get(0), 1, contentVideoModelList2.get(position).getNavModel().getNavId());final ContentViewHolder2 finalHolder1 = holder;if (!MyImageLoader.isMemoryCache(context, StorageHelper.getListSmallImgUrl(contentVideoModelList2.get(position).getVideoModelList().get(0)), finalHolder1.img1, mImageLoader)) { mImageLoader.displayImage(StorageHelper.getListSmallImgUrl(contentVideoModelList2.get(position).getVideoModelList().get(0)), finalHolder1.img1, mOptions);}holder.contentLayout1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (mItemClickListener != null) { VideoModel videoModel = contentVideoModelList2.get(position).getVideoModelList().get(0); if (!videoModel.isClicked()) {holder.newVideoImg1.setVisibility(View.GONE);videoModel.setClicked(true);videoModel.save(); } mItemClickListener.onItemClick(videoModel);} }}); } else {holder.content_layout.setVisibility(View.GONE);holder.contentLayout1.setVisibility(View.GONE);holder.contentLayout2.setVisibility(View.GONE); }

if (contentVideoModelList2.get(position).getVideoModelList().size() >= 2) {holder.contentLayout2.setVisibility(View.VISIBLE);updateHolder(holder, contentVideoModelList2.get(position).getVideoModelList().get(1), 2, contentVideoModelList2.get(position).getNavModel().getNavId());final ContentViewHolder2 finalHolder = holder;if (!MyImageLoader.isMemoryCache(context, StorageHelper.getListSmallImgUrl(contentVideoModelList2.get(position).getVideoModelList().get(1)), finalHolder.img2, mImageLoader)) { mImageLoader.displayImage(StorageHelper.getListSmallImgUrl(contentVideoModelList2.get(position).getVideoModelList().get(1)), finalHolder.img2, mOptions);}holder.contentLayout2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (mItemClickListener != null) { VideoModel videoModel = contentVideoModelList2.get(position).getVideoModelList().get(1); if (!videoModel.isClicked()) {holder.newVideoImg2.setVisibility(View.GONE);videoModel.setClicked(true);videoModel.save(); } mItemClickListener.onItemClick(videoModel);} }}); } else {holder.contentLayout2.setVisibility(View.INVISIBLE); } holder.title.setText(contentVideoModelList2.get(position).getNavModel().getTitle()); holder.moreBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { BusProvider.getInstance().post(new ContentItemEven(null, contentVideoModelList2.get(position).getNavModel(), 2, position));} });}

/** * @function 头部以下内容——类型2——SHOW_DATA * @author mootor * created at 2016/8/17 11:52 */protected void updateHolder(ContentViewHolder2 holder, VideoModel model, int item, long navId) { SpannableStringBuilder textString = null; keyword = Valuepass.newInstance().getKeywordsearch(); if (keyword != null) {textString = TextUtilTools.highlight(model.getTitle(), keyword); } else {textString = new SpannableStringBuilder(model.getTitle()); } if (item == 1) {holder.text1.setText(textString);holder.audioImg1.setVisibility(View.GONE);holder.topicImg1.setVisibility(View.GONE); } else {holder.text2.setText(textString);holder.audioImg2.setVisibility(View.GONE);holder.topicImg2.setVisibility(View.GONE); } if (navId != AUDIO_ID && navId != SUBJECT_ID) {if (model.getIsVip() == 1 /*&& !UserDBUtil.getInstance(context).isNeedLogin()*/) {// vip if (item == 1) {holder.topicImg1.setImageResource(R.drawable.corner_vip);holder.topicImg1.setVisibility(View.VISIBLE); } else {holder.topicImg2.setImageResource(R.drawable.corner_vip);holder.topicImg2.setVisibility(View.VISIBLE); }} else if (StorageHelper.isAudioRes(model)) {// 音频 if (item == 1) {holder.audioImg1.setVisibility(View.VISIBLE); } else {holder.audioImg2.setVisibility(View.VISIBLE); }} else if (model.getType() == CommonConstant.TOPIC_TYPE) {// topic if (item == 1) {holder.topicImg1.setImageResource(R.drawable.home_topic);holder.topicImg1.setVisibility(View.VISIBLE); } else {holder.topicImg2.setImageResource(R.drawable.home_topic);holder.topicImg2.setVisibility(View.VISIBLE); }} } if (model.isClicked()) {if (item == 1) { holder.newVideoImg1.setVisibility(View.GONE);} else { holder.newVideoImg2.setVisibility(View.GONE);} } else {if (item == 1) { holder.newVideoImg1.setVisibility(View.VISIBLE);} else { holder.newVideoImg2.setVisibility(View.VISIBLE);} }}

/** * @author mootor * created at 2016/8/17 11:40 * @function 头部以下内容——类型2——VIEW */public class ContentViewHolder2 extends RecyclerView.ViewHolder { private LinearLayout content_layout; private RelativeLayout contentLayout1; private RelativeLayout contentLayout2; private TextView title; private ImageView moreBtn; private ImageView img1; private TextView text1; private ImageView audioImg1; private ImageView newVideoImg1; private ImageView topicImg1; private ImageView img2; private TextView text2; private ImageView audioImg2; private ImageView newVideoImg2; private ImageView topicImg2; public ContentViewHolder2(View itemView) {super(itemView);content_layout = (LinearLayout) itemView.findViewById(R.id.content_layout);contentLayout1 = (RelativeLayout) itemView.findViewById(R.id.content_layout1);contentLayout2 = (RelativeLayout) itemView.findViewById(R.id.content_layout2);title = (TextView) itemView.findViewById(R.id.titleTv);moreBtn = (ImageView) itemView.findViewById(R.id.moreBtn);img1 = (ImageView) itemView.findViewById(R.id.content_img1);text1 = (TextView) itemView.findViewById(R.id.content_text1);audioImg1 = (ImageView) itemView.findViewById(R.id.audio_mark_img1);newVideoImg1 = (ImageView) itemView.findViewById(R.id.new_video_img1);topicImg1 = (ImageView) itemView.findViewById(R.id.topic_img1);img2 = (ImageView) itemView.findViewById(R.id.content_img2);text2 = (TextView) itemView.findViewById(R.id.content_text2);audioImg2 = (ImageView) itemView.findViewById(R.id.audio_mark_img2);newVideoImg2 = (ImageView) itemView.findViewById(R.id.new_video_img2);topicImg2 = (ImageView) itemView.findViewById(R.id.topic_img2); }}

/** * @author mootor * created at 2016/8/17 11:55 * @function 头部——单张大图——VIEW */private class HeaderViewHolderWithImager extends RecyclerView.ViewHolder { RelativeLayout headerLayout; ImageView img; TextView text; ImageView audioImg; ImageView newVideoImg; ImageView topicImg; public HeaderViewHolderWithImager(View itemView) {super(itemView);headerLayout = (RelativeLayout) itemView.findViewById(R.id.header_box);img = (ImageView) itemView.findViewById(R.id.content_img);text = (TextView) itemView.findViewById(R.id.content_text);audioImg = (ImageView) itemView.findViewById(R.id.audio_mark_img);newVideoImg = (ImageView) itemView.findViewById(R.id.new_video_img);topicImg = (ImageView) itemView.findViewById(R.id.topic_img);headerLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (mItemClickListener != null) { newVideoImg.setVisibility(View.GONE); VideoModel videoModel = heardVideoList.get(0); mItemClickListener.onItemClick(videoModel);} }}); }}

/** * @author mootor * created at 2016/8/17 11:56 * @function 头部轮播——VIEW */public class HeaderViewHolderWithViewPager extends RecyclerView.ViewHolder { private ViewPager viewPager; private TextView topAdTextView; private LinearLayout topAdDotLayout; private ImageView topToLeftBtn, topToRightBtn; public HeaderViewHolderWithViewPager(View itemView) {super(itemView);viewPager = (ViewPager) itemView.findViewById(R.id.viewPager);topAdTextView = (TextView) itemView.findViewById(R.id.tv_intro);topAdDotLayout = (LinearLayout) itemView.findViewById(R.id.dot_layout);topToLeftBtn = (ImageView) itemView.findViewById(R.id.topic_left_img);topToRightBtn = (ImageView) itemView.findViewById(R.id.topic_right_img);topToLeftBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (viewPager != null && heardVideoList.size() > 1) { viewPager.setCurrentItem(currentItemPosition - 1);} }});topToRightBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (viewPager != null && heardVideoList.size() > 1) { viewPager.setCurrentItem(currentItemPosition + 1);} }});try {//这里设置轮播切换过程的缓冲时间500毫秒 Field field = ViewPager.class.getDeclaredField('mScroller'); field.setAccessible(true); ViewPagerScroller scroller = new ViewPagerScroller(context, new AccelerateInterpolator()); field.set(viewPager, scroller); scroller.setmDuration(500);} catch (Exception e) {} }}/** * @author mootor * created at 2016/8/17 11:56 * @function 头部以下内容——类型1——VIEW */protected class ContentViewHolder1 extends RecyclerView.ViewHolder { public ImageView img, audioImg, newVideoImg, topicImg; public TextView text; public RelativeLayout layout;

public ContentViewHolder1(View itemView) {super(itemView);layout = (RelativeLayout) itemView.findViewById(R.id.layout);img = (ImageView) itemView.findViewById(R.id.content_img);text = (TextView) itemView.findViewById(R.id.content_text);audioImg = (ImageView) itemView.findViewById(R.id.audio_mark_img);newVideoImg = (ImageView) itemView.findViewById(R.id.new_video_img);topicImg = (ImageView) itemView.findViewById(R.id.topic_img);layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {if (mItemClickListener != null) { newVideoImg.setVisibility(View.GONE); VideoModel videoModel = contentVideoModelList1.get(heardVideoList == null ? getPosition() : heardVideoList.size() > 0 ? getPosition() - 1 : getPosition()); mItemClickListener.onItemClick(videoModel); videoModel.setClicked(true); videoModel.save();} }}); }}

/** * @author mootor * created at 2016/8/17 11:54 * @function item点击监听 */public interface MyItemClickListener { void onItemClick(VideoModel videoModel);}

/** * 初始化dot——头部轮播 */private void initDots(HeaderViewHolderWithViewPager viewHolder) { for (int i = 0; i < heardVideoList.size(); i++) {View view = new View(context);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15);if (i != 0) { params.leftMargin = 8;}view.setLayoutParams(params);view.setBackgroundResource(R.drawable.selector_dot);if (i != 0) { view.setEnabled(false);}viewHolder.topAdDotLayout.addView(view); }}/** * 更新文本——头部轮播 */private void updateIntroAndDot(HeaderViewHolderWithViewPager view) { try {int currentPage = view.viewPager.getCurrentItem() % heardVideoList.size();view.topAdTextView.setText(heardVideoList.get(currentPage).getTitle());for (int i = 0; i < view.topAdDotLayout.getChildCount(); i++) { view.topAdDotLayout.getChildAt(i).setEnabled(i == currentPage);} } catch (Exception e) { }}

}

问题解答

回答1:

你好,我做过比这个更稍微复杂的效果,不过也是ViewPager+Fragment的组合,里面也是头部轮播图+列表,不过我们是动态的,针对ViewPager+Fragment这个组合效果的话,一般网上好多建议是1.Fragment采用懒加载方式2.尽量使用FragmentStateAdapter(具体原因,你可以百度)3.使用缓存机制避免重复的网络请求4.延迟进行网络请求5.使用一些比较出色的开源框架,比如图片框架可以使用性能出色的Fresco。6.就是一些基础的知识点,比如尽量避免UI线程中过多耗时操作,7.就是Fragment的一些基础知识,比如生命周期控制(避免出现内存泄露或者是空指针),然后可以进行状态保存这些是暂时能想到的,我当时采用了这些方式,效果在低端机上还可以,

回答2:

你的布局是什么

回答3:

看你的代码 没有做 缓存啊

回答4:

等待最终的解决办法!

相关文章: