二:ViewPage
//源码在底部
0x001.布局文件
<RelativeLayout 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" >
<HorizontalScrollView
android:id="@+id/top_channel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<RadioGroup
android:id="@+id/radio_top_channel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</RadioGroup>
</HorizontalScrollView>
<util.l.viewpage.widget.CustomViewPager
android:id="@+id/viewpage_main"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_channel" >
</util.l.viewpage.widget.CustomViewPager>
</RelativeLayout>
0x002.主要代码
package util.l.viewpage;
import java.util.ArrayList;
import java.util.List;
import util.l.viewpage.Fragment.TabFragment1;
import util.l.viewpage.Fragment.TabFragment2;
import util.l.viewpage.util.Item;
import util.l.viewpage.util.ItemDb;
import util.l.viewpage.widget.CustomViewPager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.HorizontalScrollView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
/**
*
* @author L
* @time 2016.2.19 一个用来显示TabView的类,Fragment+ViewPage实现
*
*/
public class BaseViewPage extends FragmentActivity implements
OnPageChangeListener {
private CustomViewPager viewPager;
private RadioGroup rgItem;
private HorizontalScrollView hvItem;
private FragmentPagerAdapter adapter = null;
private List<Fragment> fragmentList = new ArrayList<Fragment>();
private Boolean isUse = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
rgItem = (RadioGroup) findViewById(R.id.radio_top_channel);
viewPager = (CustomViewPager) findViewById(R.id.viewpage_main);
hvItem = (HorizontalScrollView) findViewById(R.id.top_channel);
rgItem.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkId) {
viewPager.setCurrentItem(checkId);
}
});
viewPager.setOnPageChangeListener(this);
adapter = new PageFragmentAdapter(getSupportFragmentManager(),
fragmentList);
viewPager.setAdapter(adapter);
// initTab();
// initViewPage();
}
private void initTab() {
List<Item> itemList = ItemDb.getSelectedItem();
rgItem.removeAllViews();
for (int i = 0; i < itemList.size(); i++) {
RadioButton rb = (RadioButton) LayoutInflater.from(this).inflate(
R.layout.tab_rb, null);
rb.setId(i);
rb.setText(itemList.get(i).getItemName());
RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(
RadioGroup.LayoutParams.WRAP_CONTENT,
RadioGroup.LayoutParams.WRAP_CONTENT);
rgItem.addView(rb, params);
}
rgItem.check(0);
}
/*
* private void initViewPage() { for (int i = 0; i <
* ItemDb.getSelectedItem().size(); i++) { if (i % 2 == 0)
* fragmentList.add(new TabFragment1()); else fragmentList.add(new
* TabFragment2()); } adapter = new
* PageFragmentAdapter(getSupportFragmentManager(), fragmentList);
* viewPager.setAdapter(adapter); }
*/
private void setTab(int position) {
RadioButton rb = (RadioButton) rgItem.getChildAt(position);
rb.setChecked(true);
int left = rb.getLeft();
int width = rb.getMeasuredWidth();
DisplayMetrics metrics = new DisplayMetrics();
super.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int screenWidth = metrics.widthPixels;
int len = left + width / 2 - screenWidth / 2;
hvItem.smoothScrollTo(len, 0);// 滑动ScroollView
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
setTab(position);
}
private class PageFragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
private FragmentManager fm;
public PageFragmentAdapter(FragmentManager fm,
List<Fragment> fragmentList) {
super(fm);
this.fragmentList = fragmentList;
this.fm = fm;
}
@Override
public Fragment getItem(int arg0) {
return fragmentList.get(arg0 % fragmentList.size());
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
/**
* addItem 在子类中调用此方法来添加一个Tab页
*
* @param itemNames
* 此Tab页面的标题
* @param fragments
* 此Tab页面的Fragment
* @time 2016.2.19 exception: can't change tag of Fragment
* 此处不要添加同一个Fragment,请重新instance一个Fragment 此方法在子类中只可且必须调用一次
*/
public void setItem(String[] itemNames, List<Fragment> fragments) {
if (isUse)
return;
else
isUse = !isUse;
setItemName(itemNames);
setItemFragment(fragments);
initTab();
adapter.notifyDataSetChanged();
}
private void setItemName(String[] itemNames) {
ItemDb.cleanSelectItem();
for (String itemName : itemNames) {
ItemDb.addSelectItem(itemName);
}
// initView();
}
private void setItemFragment(List<Fragment> fragments) {
for (int i = 0; i < ItemDb.getSelectedItem().size(); i++) {
fragmentList.add(fragments.get(i % fragments.size()));
}
}
/**
* setTopNameShow 在子类中调用此方法来设置是否显示Tab页顶部的ScrollView
*
* @param isShow
* 是否现在名称
* @time 2016.2.22
*/
public void setTopNameShow(Boolean isShow) {
if (isShow)
findViewById(R.id.top_channel).setVisibility(View.VISIBLE);
else
findViewById(R.id.top_channel).setVisibility(View.GONE);
}
/**
* addItem 在子类中调用此方法来添加一个Page页
*
* @param itemName
* 页面标题
* @param itemFragment
* 页面内容
*/
public void addItem(String itemName, Fragment itemFragment) {
ItemDb.addSelectItem(itemName);
RadioButton rb = (RadioButton) LayoutInflater.from(this).inflate(
R.layout.tab_rb, null);
rb.setId(rgItem.getChildCount());
rb.setText(itemName);
RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(
RadioGroup.LayoutParams.WRAP_CONTENT,
RadioGroup.LayoutParams.WRAP_CONTENT);
rgItem.addView(rb, params);
fragmentList.add(itemFragment);
adapter.notifyDataSetChanged();
}
/**
* setScroll 设置Viewpager是否可以通过滑动切换Tab页面
* @param canScroll 通过canScroll
*/
public void setScroll(boolean canScroll) {
viewPager.setScroll(canScroll);
}
/**
* removeItemById 移除指定ID的Item
* @param id 需要移除的Item的ID
*/
public void removeItemByID(int id) {
ItemDb.removeSelectItem(id);
fragmentList.remove(id);
initTab();
adapter.notifyDataSetChanged();
}
/**
* removeItemByName 移除指定标题的Item
* @param name 需要移除的Item的名称
*/
public void removeItemByName(String name){
ArrayList<Integer> ids = ItemDb.getItemIDSByName(name);
ids = sortIds(ids);
if(ids.size() != 0){
for (Integer integer : ids) {
removeItemByID(integer.intValue());
}
}
}
/**
* sortIds 对获取到的Ids进行从大到小排序来防止数组Id变更引发后面的ID错误
* @param Ids 先前获取到的Ids
* @return 排序后的Ids
*/
private ArrayList<Integer> sortIds(ArrayList<Integer> Ids) {
for (int i = 0; i < Ids.size() - 1; i++) {
for (int j = i + 1; j < Ids.size(); j++) {
if(Ids.get(i) < Ids.get(j)){
Ids.set(i, Ids.get(i) ^ Ids.get(j));
Ids.set(j, Ids.get(j) ^ Ids.get(i));
Ids.set(i, Ids.get(i) ^ Ids.get(j));
}
}
}
return Ids;
}
}
0x003.子类调用
OnCreate之后初始化填充数据
package util.l.viewpage;
import java.util.ArrayList;
import java.util.List;
import util.l.viewpage.Fragment.TabFragment1;
import util.l.viewpage.Fragment.TabFragment2;
import android.os.Bundle;
import android.support.v4.app.Fragment;
public class ViewPageActivity extends BaseViewPage {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initTabItem();
}
private void initTabItem() {
setTab();
addItem("item3", new TabFragment1());
// removeItemByName("item3");
setScroll(true);
}
private void setTab() {
String[] itemNames = new String[] { "items1", "items2", "item3",
"item4" };
List<Fragment> fragments = new ArrayList<Fragment>();
fragments.add(new TabFragment1());
fragments.add(new TabFragment2());
fragments.add(new TabFragment1());
fragments.add(new TabFragment2());
setItem(itemNames, fragments);
setTopNameShow(true);
}
}