package com.tweetlanes.android.core.widget.viewpagerindicator; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.tweetlanes.android.core.R; import java.util.ArrayList; /** * This widget implements the dynamic action bar tab behavior that can change * across different configurations or circumstances. */ public class ListTabPageIndicator extends ListView implements PageIndicator { private Runnable mTabSelector; private final OnClickListener mTabClickListener = new OnClickListener() { public void onClick(View view) { TabView tabView = (TabView) view; mViewPager.setCurrentItem(tabView.getIndex()); } }; // private LinearLayout mTabLayout; private final Context mContext; private ViewPager mViewPager; private ViewPager.OnPageChangeListener mListener; private final LayoutInflater mInflater; int mMaxTabWidth; private int mSelectedTabIndex; public ListTabPageIndicator(Context context) { this(context, null); } public ListTabPageIndicator(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; // setHorizontalScrollBarEnabled(false); mInflater = LayoutInflater.from(context); // mTabLayout = new LinearLayout(getContext()); // addView(mTabLayout, new // ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, // ViewGroup.LayoutParams.FILL_PARENT)); } /* * @Override public void onMeasure(int widthMeasureSpec, int * heightMeasureSpec) { final int widthMode = * MeasureSpec.getMode(widthMeasureSpec); final boolean lockedExpanded = * widthMode == MeasureSpec.EXACTLY; //setFillViewport(lockedExpanded); * final int childCount = getChildCount(); if (childCount > 1 && (widthMode * == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { if * (childCount > 2) { // TweetLanes: Change max width so names don't get cut * off //mMaxTabWidth = (int)(MeasureSpec.getSize(widthMeasureSpec) * 0.4f); * mMaxTabWidth = (int)(MeasureSpec.getSize(widthMeasureSpec) * 0.5f); } * else { mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2; } } else * { mMaxTabWidth = -1; } final int oldWidth = getMeasuredWidth(); * super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int newWidth * = getMeasuredWidth(); if (lockedExpanded && oldWidth != newWidth) { // * Recenter the tab display if we're at a new (scrollable) size. * setCurrentItem(mSelectedTabIndex); } } */ /* * private void animateToTab(final int position) { //final View tabView = * mTabLayout.getChildAt(position); if (mTabSelector != null) { * removeCallbacks(mTabSelector); } mTabSelector = new Runnable() { public * void run() { //final int scrollPos = tabView.getLeft() - (getWidth() - * tabView.getWidth()) / 2; //smoothScrollTo(scrollPos, 0); * setSelection(position); // TODO: Animate mTabSelector = null; } }; * post(mTabSelector); } */ @Override public void onAttachedToWindow() { super.onAttachedToWindow(); if (mTabSelector != null) { // Re-post the selector we saved post(mTabSelector); } } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mTabSelector != null) { removeCallbacks(mTabSelector); } } /* * private void addTab(String text, int index) { //Workaround for not being * able to pass a defStyle on pre-3.0 final TabView tabView = * (TabView)mInflater.inflate(R.layout.vpi_listtab, null); * tabView.init(this, text, index); tabView.setFocusable(true); * tabView.setOnClickListener(mTabClickListener); * //mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, * LayoutParams.FILL_PARENT, 1)); this.addView(tabView, index); } */ @Override public void onPageScrollStateChanged(int arg0) { if (mListener != null) { mListener.onPageScrollStateChanged(arg0); } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (mListener != null) { mListener.onPageScrolled(arg0, arg1, arg2); } } @Override public void onPageSelected(int position) { setCurrentItem(position); if (mListener != null) { mListener.onPageSelected(position); } } @Override public void setViewPager(ViewPager view) { final PagerAdapter adapter = view.getAdapter(); if (adapter == null) { throw new IllegalStateException( "ViewPager does not have adapter instance."); } if (!(adapter instanceof TitleProvider)) { throw new IllegalStateException( "ViewPager adapter must implement TitleProvider to be used with TitlePageIndicator."); } mViewPager = view; view.setOnPageChangeListener(this); notifyDataSetChanged(); } public void notifyDataSetChanged() { // removeAllViews(); ArrayList<String> names = new ArrayList<String>(); TitleProvider adapter = (TitleProvider) mViewPager.getAdapter(); final int count = ((PagerAdapter) adapter).getCount(); for (int i = 0; i < count; i++) { CharSequence cs = adapter.getTitle(i); if (cs != null) { String name = cs.toString(); names.add(name.toUpperCase()); } } if (names.size() > 0) { String[] array = names.toArray(new String[names.size()]); ListArrayAdapter listAdapter = new ListArrayAdapter(mContext, array); // mListAdapter.notify(); setAdapter(listAdapter); /* * TitleProvider adapter = (TitleProvider)mViewPager.getAdapter(); * final int count = ((PagerAdapter)adapter).getCount(); for (int i * = 0; i < count; i++) { addTab(adapter.getTitle(i), i); * //addView(child, i); } if (mSelectedTabIndex > count) { * mSelectedTabIndex = count - 1; } */ setCurrentItem(mSelectedTabIndex); requestLayout(); } } @Override public void setViewPager(ViewPager view, int initialPosition) { setViewPager(view); setCurrentItem(initialPosition); } @Override public void setCurrentItem(int item) { if (mViewPager == null) { throw new IllegalStateException("ViewPager has not been bound."); } mSelectedTabIndex = item; final int tabCount = getChildCount(); for (int i = 0; i < tabCount; i++) { final View child = getChildAt(i); final boolean isSelected = (i == item); child.setSelected(isSelected); if (isSelected) { // animateToTab(item); } } } @Override public void setOnPageChangeListener(OnPageChangeListener listener) { mListener = listener; } /* * */ public static class TabView extends LinearLayout { // private ListTabPageIndicator mParent; private int mIndex; public TabView(Context context, AttributeSet attrs) { super(context, attrs); } public void init(String text, int index) { // mParent = parent; mIndex = index; TextView textView = (TextView) findViewById(android.R.id.text1); textView.setText(text); } /* * @Override public void onMeasure(int widthMeasureSpec, int * heightMeasureSpec) { super.onMeasure(widthMeasureSpec, * heightMeasureSpec); // Re-measure if we went beyond our maximum size. * if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > * mParent.mMaxTabWidth) { * super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, * MeasureSpec.EXACTLY), heightMeasureSpec); } } */ public int getIndex() { return mIndex; } } /* * */ public class ListArrayAdapter extends ArrayAdapter<String> { // private final Context context; private final String[] values; public ListArrayAdapter(Context context, String[] values) { super(context, R.layout.vpi_listtab, values); // this.context = context; this.values = values; } @Override public View getView(int position, View convertView, ViewGroup parent) { // LayoutInflater inflater = (LayoutInflater) // context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); String text = values[position]; final TabView tabView = (TabView) mInflater.inflate( R.layout.vpi_listtab, null); tabView.init(text, position); tabView.setFocusable(true); tabView.setOnClickListener(mTabClickListener); return tabView; // View rowView = inflater.inflate(R.layout.vpi_listtab, parent, // false); // TextView textView = (TextView) rowView.findViewById(R.id.label); // ImageView imageView = (ImageView) // rowView.findViewById(R.id.logo); // textView.setText(values[position]); // return rowView; } } }