package com.anthony.library.widgets.banner; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.anthony.imageloader.ImageLoader; import com.anthony.imageloader.ImageLoaderUtil; import com.anthony.library.R; import com.anthony.library.data.bean.NewsItem; import com.viewpagerindicator.PageIndicator; import java.util.ArrayList; import java.util.List; /** * a implementation of banner pics * using {@link NewsItem} as a item of banner */ public class RecommendController { ImageLoaderUtil imageLoaderUtil; public static final int SWITCH_PAGE_DURATION = 5 * 1000; public interface OnItemClickListener { void onItemClick(NewsItem topic); } private ArrayList<NewsItem> mTopicList = new ArrayList<>(); private View mView; private ViewPager mViewPager; private TextView mTitle; private PageIndicator mIndicator; private Context mContext; private OnItemClickListener mOnItemClickListener; private EDog mSwitchPageEDog = new EDog(); private boolean mAutoSwitchPage; private int mLayoutID; private Runnable mSwitchPageTask = new Runnable() { @Override public void run() { if (mViewPager.getAdapter().getCount() > 0) { int switchToItem = (mViewPager.getCurrentItem() + 1) % mViewPager.getAdapter().getCount(); mViewPager.setCurrentItem(switchToItem); startSwitchPage(); } } }; public RecommendController(Context context) { this(context, true); } public RecommendController(Context context, boolean autoSwitchPage) { this(context, R.layout.lib_recommend_controller, autoSwitchPage); } /** * Requirement of layout id * Required view: * * ViewPager with id: pager * * PageIndicator with id: pager_indicator * Optional view: * TextView with id: title * * @param context context * @param layoutId layoutID * @param autoSwitchPage is auto switch page */ public RecommendController(Context context, int layoutId, boolean autoSwitchPage) { this.mContext = context; this.mLayoutID = layoutId; this.mAutoSwitchPage = autoSwitchPage; imageLoaderUtil = new ImageLoaderUtil(); createView(); startSwitchPage(); } private PagerAdapter mAdapter = new PagerAdapter() { @Override public int getCount() { return mTopicList.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { final NewsItem topic = mTopicList.get(position); ImageView imgView = new ImageView(mContext); imgView.setScaleType(ImageView.ScaleType.CENTER_CROP); String url = topic.getImgs().get(0); ImageLoader.Builder builder = new ImageLoader.Builder(); ImageLoader img = builder.url(url) .imgView(imgView).strategy(ImageLoaderUtil.LOAD_STRATEGY_ONLY_WIFI).build(); imageLoaderUtil.loadImage(mContext, img); container.addView(imgView); imgView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(topic); } } }); return imgView; } @Override public CharSequence getPageTitle(int position) { return mTopicList.get(position).getTitle(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } public int getItemPosition(Object object) { return POSITION_NONE; } }; public View getView() { return mView; } private void createView() { LayoutInflater factory = LayoutInflater.from(mContext); mView = factory.inflate(mLayoutID, null); mViewPager = (ViewPager) mView.findViewById(R.id.pager); mTitle = (TextView) mView.findViewById(R.id.title); mIndicator = (PageIndicator) mView.findViewById(R.id.pager_indicator); mViewPager.setAdapter(mAdapter); mViewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: cancelSwitchPage(); System.out.println("Touches ViewPager, cancel EDog task"); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: startSwitchPage(); System.out.println("Un-touches ViewPager, start EDog task"); break; } return false; } }); mIndicator.setViewPager(mViewPager); mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { RecommendController.this.onPageSelected(position); } @Override public void onPageScrollStateChanged(int state) { } }); if (mTopicList.size() == 0) { mView.setVisibility(View.GONE); } } private void onPageSelected(int position) { if (position >= 0) { String titleText = mAdapter.getPageTitle(position).toString(); mTitle.setText(titleText); } } public void setTopicList(List<NewsItem> topicList) { mTopicList.clear(); if (topicList != null) { mTopicList.addAll(topicList); } mAdapter.notifyDataSetChanged(); if (mAdapter.getCount() > 0) { onPageSelected(mViewPager.getCurrentItem()); } mView.setVisibility(mAdapter.getCount() > 0 ? View.VISIBLE : View.GONE); startSwitchPage(); } public void clearTopicList() { mTopicList.clear(); } public void setOnClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } public void cancelSwitchPage() { mSwitchPageEDog.cancel(); } public void startSwitchPage() { if (mAutoSwitchPage) { mSwitchPageEDog.feed(mSwitchPageTask, SWITCH_PAGE_DURATION); } } public void onPause() { cancelSwitchPage(); } public void onResume() { startSwitchPage(); } }