1。主界面的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.huihui.viewpage.activity.DaohHangActivity"> <HorizontalScrollView android:id="@+id/hvChannel" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> <RadioGroup android:id="@+id/rgChannel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> </RadioGroup> </HorizontalScrollView> <android.support.v4.view.ViewPager android:id="@+id/vpNewsList" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager> </LinearLayout>
2. DaohHangActivity.class
public class DaohHangActivity extends FragmentActivity implements OnPageChangeListener { RadioGroup rgChannel; HorizontalScrollView hvChannel; ViewPager vpNewsList; private FragPageAdapter adaper; private FragStatePageAdapter statePageAdapter; private String[] titles = {"头条", "娱乐", "军事", "美女", "新闻", "好声音", "明星", "KTV"}; private List<Fragment> fragmentList; private boolean[] fragmentsUpdateFlag; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_daoh_hang); initView(); initTab(); initViewPage(); } private void initView() { rgChannel = (RadioGroup) findViewById(R.id.rgChannel); hvChannel = (HorizontalScrollView) findViewById(R.id.hvChannel); vpNewsList = (ViewPager) findViewById(R.id.vpNewsList); rgChannel.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int i) { vpNewsList.setCurrentItem(i); } }); vpNewsList.setOnPageChangeListener(this); } private void initTab() { fragmentsUpdateFlag = new boolean[titles.length]; for (int i = 0; i < titles.length; i++) { fragmentsUpdateFlag[i] = false; RadioButton radioButton = (RadioButton) LayoutInflater.from(this).inflate(R.layout.tab_rb, null); radioButton.setId(i); radioButton.setText(titles[i]); RadioGroup.LayoutParams params = new RadioGroup.LayoutParams( RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT); rgChannel.addView(radioButton, params); rgChannel.check(0); } } private void initViewPage() { fragmentList = new ArrayList<>(titles.length); for (int i = 0; i < titles.length; i++) { NewsFragmnet fragmnet = new NewsFragmnet(); Bundle bundle = new Bundle(); bundle.putString("name" + i, titles[i]); fragmnet.setArguments(bundle); Log.i("DaohHangActivity", fragmnet.hashCode() + ""); fragmentList.add(fragmnet); } adaper = new FragPageAdapter(getSupportFragmentManager(), fragmentList, fragmentsUpdateFlag); statePageAdapter = new FragStatePageAdapter(getSupportFragmentManager(), fragmentList); vpNewsList.setAdapter(adaper); } /** * getMeasuredWidth:包括隐藏的长度 * 滑动ViewPager时调整ScroollView的位置以便显示按钮 */ private void setTab(int index) { RadioButton radioButton = (RadioButton) rgChannel.getChildAt(index); radioButton.setChecked(true); int left = radioButton.getLeft();//视图左侧的位置 int width = radioButton.getMeasuredWidth();//包含被隐藏的位置 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //将当前窗口的一些信息放在DisplayMetrics类中 int screenWidth = metrics.widthPixels; int len = left + width / 2 - screenWidth / 2;//控件放到中间 hvChannel.smoothScrollTo(len, 0); } @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { setTab(i); } @Override public void onPageScrollStateChanged(int i) { } }
3.Fragment.class
/** * Created by lvpeng on 2015/8/21. */ public class NewsFragmnet extends Fragment { private String TAG = getClass().getSimpleName(); private int hashCode = this.hashCode(); private int hashCode1=getClass().hashCode(); @Override public void onAttach(Context context) { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onAttach(context); } @Override public void onCreate(Bundle savedInstanceState) { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); View view = inflater.inflate(R.layout.layout_new_frag, container, false); TextView textView= (TextView) view.findViewById(R.id.textView); textView.setText(hashCode+""); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onActivityCreated(savedInstanceState); } @Override public void onStart() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onStart(); } @Override public void onResume() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onResume(); } @Override public void onPause() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onPause(); } @Override public void onStop() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onStop(); } @Override public void onDestroyView() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onDestroyView(); } @Override public void onDestroy() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onDestroy(); } @Override public void onDetach() { String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); printlog(Method); super.onDetach(); } @Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { return super.onCreateAnimation(transit, enter, nextAnim); } private void printlog(String method) { Log.i(TAG, "==hashcode==" + hashCode + "===method===" + method); }4 适配器adapter
/** * Created by lvpeng on 2015/8/21. */ public class FragPageAdapter extends FragmentPagerAdapter { private List<Fragment> list; private FragmentManager manager; private boolean[] fragmentsUpdateFlag; public FragPageAdapter(FragmentManager fm, List<Fragment> list, boolean[] fragmentsUpdateFlag) { super(fm); this.list = list; manager = fm; this.fragmentsUpdateFlag = fragmentsUpdateFlag; } @Override public Object instantiateItem(ViewGroup container, int position) { //得到缓存的fragment Fragment fragment = (Fragment) super.instantiateItem(container, position); // Fragment fragment = getItem(position); //得到tag String fragmentTag = fragment.getTag(); if (fragmentsUpdateFlag[position % list.size()]) { //如果这个fragment需要更新 FragmentTransaction transaction = manager.beginTransaction(); transaction.remove(fragment); fragment = list.get(position % list.size()); transaction.add(container.getId(), fragment, fragmentTag); transaction.attach(fragment); transaction.commit(); //复位更新标志 fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false; } return fragment; } @Override public Fragment getItem(int position) { Fragment fragment = list.get(position % list.size()); Log.i("=======", "getItem:position=" + position + ",fragment:" + fragment.getClass().getName() + ",fragment.tag=" + fragment.getTag()); return fragment; } @Override public int getCount() { return list.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }
5 fragment 的布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_bright" android:gravity="center"> <RadioButton android:id="@+id/radioButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="New RadioButton" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="New Text" android:textColor="@android:color/holo_blue_light" android:textSize="30sp" /> </LinearLayout>