ViewPage,TabHost与Fragment(下)

本文介绍了一个使用Fragment和ViewPage实现的TabView类BaseViewPage,详细阐述了其布局、代码实现以及Tab页面的添加、切换等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二: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);
	}
}

源码下载: http://download.youkuaiyun.com/detail/xiao_wl/9478693

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值