andorid之tab+fragment的使用及结合viewpager,滑动时候重新oncreateView的优化

一、tab+fragment的show()、hide()的使用

       

/**
 * 
 * @author zhongwr
 * 
 */
public class AllBangTabAct extends BaseActivity implements RequestCallBack, JoinOrExitBangLister {

	/** 当前选中的tab下标 */
	private int currIndex = 0;
	/** 当前选中的tab Textview */
	private TextView tvCurrTab;
	/** tab游标动画图片 */
	private ImageView ivTabIndicator;
	/** tab动画图片偏移量 */
	private int offset = 0;
	/** 返回、搜索 */
	private ImageView ivBack, ivSearch;



	/** 是否是b */
	private boolean isMyBang = true;

	/** 若首次进入不是b,则此帮类id不能为空 */
	private int categoryId;

	/** b集合 */
	private ArrayList<MyBangItem> myBangList;
	/** 或者其他tab(非b)对应的帮集合 */
	private ArrayList<BangInfo> notMybangList;
	private Context mContext;
	private ViewPager vpFragmentContainer;
	private TabBangFragmentAdapter fragmentPagerAdapter;
	/** fragment集合 */
	private List<Fragment> fragmentList;
	/** tab栏view:所有tab的容器 */
	private LinearLayout llTabContainer;
	/** 所有帮的tab集合 */
	private ArrayList<BangCategoryInfo> allBangTabList;
	/** tab对应的view */
	private List<TextView> tabTextViewList;

	/***
	 * 
	 * @description 启动当前act
	 * @author zhongwr
	 * @param categoryId
	 *            帮类id:若加载的不是b ,此id不能为空
	 * @param isMyBang
	 *            是不是b
	 */
	public static void startAllBangTabAct(Context context, boolean isMyBang, String categoryId) {
		if (null != context) {
			Intent intent = new Intent(context, AllBangTabAct.class);
			intent.putExtra("isMyBang", isMyBang);
			intent.putExtra("categoryId", categoryId);
			context.startActivity(intent);
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.all_bang_tab_act);
		mContext = this;
		initViews();
		initListener();
		initData(savedInstanceState);
	}

	/**
	 * 初始化View
	 */
	@Override
	protected void initViews() {
		ivTabIndicator = (ImageView) findViewById(R.id.iv_tab_indicator);
		ivBack = (ImageView) findViewById(R.id.back_button);
		ivSearch = (ImageView) findViewById(R.id.ivRight);
		llTabContainer = (LinearLayout) findViewById(R.id.ll_all_tab_parent);
		vpFragmentContainer = (ViewPager) findViewById(R.id.vp_tab_fragments_container);
	}

	private void initData(Bundle savedInstanceState) {
		Intent intent = getIntent();
		isMyBang = intent.getBooleanExtra("isMyBang", true);
		categoryId = intent.getIntExtra("categoryId", 1);
		tabTextViewList = new ArrayList<TextView>();
		// 关闭预加载 :设置缓存fragment 的个数(实际有1个,缓存1个+正在显示的1个):好像然并卵
		vpFragmentContainer.setOffscreenPageLimit(1);
		fragmentPagerAdapter = new TabBangFragmentAdapter(super.getSupportFragmentManager(),
				fragmentList = new ArrayList<Fragment>());
		vpFragmentContainer.setAdapter(fragmentPagerAdapter);
		// fragmentManager = getSupportFragmentManager();
		requestAllTabAndBang();
	}

	private void initListener() {
		ivSearch.setOnClickListener(this);
		ivBack.setOnClickListener(this);
		setClickToReloadListener(new Reload() {
			@Override
			public void OnReloadClick(View view) {// 点击重新加载
				requestAllTabAndBang();
			}
		});
		vpFragmentContainer.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int position) {
				categoryId = allBangTabList.get(position).id;
				startTabIndicatorAnim(position);
				setSelectTabColor(tabTextViewList.get(position));
				if (1 == categoryId && isJoinOrExitBang()) {// 我的帮:其他帮有加帮或退帮,则刷新我的帮页面
					TabMyBangFragment myBangFragment = (TabMyBangFragment) fragmentList.get(position);
					if (null != myBangFragment) {
						myBangFragment.requesMyBang();
					}
				}
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {

			}
		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.back_button:// 返回
			finish();
			break;
		case R.id.ivRight:// 搜索

			break;

		default:
			break;
		}
	}

	/**
	 * tab点击监听
	 */

	public class MyOnClickListener implements View.OnClickListener {

		private int tabIndex;// 当前选中的tabItem的索引

		public MyOnClickListener(int tabIndex) {
			this.tabIndex = tabIndex;
		}

		@Override
		public void onClick(View v) {
			if (tabIndex != currIndex) {
				// viewpager 选中时,在监听器那执行游标动画
				vpFragmentContainer.setCurrentItem(tabIndex);
			}
		}
	};

	/**
	 * 
	 * @description 设置当前选中的tab颜色
	 * @author zhongwr
	 * @update 2015-11-3 下午9:08:31
	 */
	private void setSelectTabColor(TextView tvSelectedTab) {
		if (null != tvCurrTab && null != tvSelectedTab) {
			tvCurrTab.setTextColor(getResources().getColor(R.color.gray_7));
			tvCurrTab = tvSelectedTab;
			tvSelectedTab.setTextColor(getResources().getColor(R.color.red_1));
		}
	}

         // 不结合viewpager,直接使用hide()、show()来切换,可以避免重新oncreateView
        <span style="color:#ff0000;">//执行hide() show()方法时,会回调执行fragment中的onHiddenChanged()方法</span>
	<span style="color:#ff0000;"> private void switchFragment(int tabIndex) {
		FragmentTransaction transaction = fragmentManager.beginTransaction().setCustomAnimations(
				android.R.anim.fade_in, android.R.anim.fade_out);
		if (categoryId == 100) {// 
			if (null == myBangFragment) {
				myBangFragment = (TabMyBangFragment) fragmentManager.findFragmentByTag(TAG_MY_BANG);
			}
			
			 if (isJoinOrExitBang()) {// 退群或加群、重新加载首页clearJoinOrExitBang(); if (null != myBangFragment) {
			 fragmentManager.beginTransaction().remove(myBangFragment).commit(); myBangFragment = null; } }
			 
			// 如果加群或退群需要更新TabMyBangFragment ,则在TabMyBangFragment 的onHiddenChanged方法中,重新请求起的帮信息
			if (null == myBangFragment) {
				myBangFragment = TabMyBangFragment.newInstance(categoryId, false, null, null);
				transaction.hide(currentFragment).add(R.id.fl_fragment_container, myBangFragment, TAG_MY_BANG).commit();
			} else {
				transaction.hide(currentFragment).show(myBangFragment).commit();
			}
			currentFragment = myBangFragment;
		} else {
			TabCategoryBangFragment currentTabFragment = (TabCategoryBangFragment) fragmentManager
					.findFragmentByTag(TAG_NOT_MY_BANG + tabIndex);
			if (null == currentTabFragment) {
				currentTabFragment = TabCategoryBangFragment.newInstance(categoryId, false, null);
				transaction.hide(currentFragment)
						.add(R.id.fl_fragment_container, currentTabFragment, TAG_NOT_MY_BANG + tabIndex).commit();
			} else {
				transaction.hide(currentFragment).show(currentTabFragment).commit();
			}
			currentFragment = currentTabFragment;
		}
	}</span>

	/**
	 * 被选中的tab的下标
	 * 
	 * @author zhongwr
	 */
	private void startTabIndicatorAnim(int selectedTabIndex) {
		int fromXDelta = offset * Math.abs(currIndex);
		int toXDelta;
		if (currIndex > selectedTabIndex) {// 点击左边标签
			toXDelta = fromXDelta - offset * (currIndex - selectedTabIndex);
		} else {// 点击右边标签
			toXDelta = fromXDelta + offset * (selectedTabIndex - currIndex);
		}
		currIndex = selectedTabIndex;
		Animation animation = new TranslateAnimation(fromXDelta, toXDelta, 0, 0);
		animation.setFillAfter(true);// True:图片停在动画结束位置
		animation.setDuration(300);
		ivTabIndicator.startAnimation(animation);
	}

	/**
	 * 
	 * @description 添加tab栏
	 * @author zhongwr
	 * @update 2015年9月1日 下午5:24:44
	 */
	@SuppressLint("ResourceAsColor")
	private void addTabsAndFragments() {
		if (!Tools.isListEmpty(allBangTabList)) {
			llTabContainer.setVisibility(View.VISIBLE);
			llTabContainer.removeAllViews();
			int size = allBangTabList.size();
			llTabContainer.setWeightSum(size);
			LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,
					ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
			// layoutParams.leftMargin = 100;
			TextView tvTab = null;
			BangCategoryInfo tabItem = null;
			for (int i = 0; i < size; i++) {
				tabItem = allBangTabList.get(i);
				tvTab = createTabTextView(tabItem, layoutParams, i, size);
				tvTab.setOnClickListener(new MyOnClickListener(tabItem.tabIndex));
				tabTextViewList.add(tvTab);
				if (categoryId == tabItem.id) {// 当前选中的
					currIndex = tabItem.tabIndex;
					tvCurrTab = tvTab;
					tvTab.setTextColor(getResources().getColor(R.color.red_1));
					if (tabItem.id == 1) {
						fragmentList.add(TabMyBangFragment.newInstance(tabItem.id, true, myBangList, notMybangList));
					} else {
						fragmentList.add(TabCategoryBangFragment.newInstance(tabItem.id, true, notMybangList));
					}
				} else {
					if (tabItem.id == 1) {
						fragmentList.add(TabMyBangFragment.newInstance(tabItem.id, false, null, null));
					} else {
						fragmentList.add(TabCategoryBangFragment.newInstance(tabItem.id, false, null));
					}
				}
				llTabContainer.addView(tvTab);
			}
		} else {
			llTabContainer.setVisibility(View.GONE);
			setReloadVisiable();
		}
	}

	/**
	 * 
	 * @description 创建分类的tab的textview
	 * @author zhongwr
	 * @update 2015年9月1日 下午5:31:05
	 */
	private TextView createTabTextView(BangCategoryInfo tabItem, LinearLayout.LayoutParams layoutParams, int position,
			int size) {
		TextView tvBangTab = new TextView(this);
		tvBangTab.setText(tabItem.name);
		tvBangTab.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
		tvBangTab.setPadding(0, 17, 0, 17);
		tvBangTab.setTextColor(getResources().getColor(R.color.gray_7));
		// if (0 == position) {
		// tvBangTab.setGravity(Gravity.LEFT);
		// } else if (position == size - 1) {
		// tvBangTab.setGravity(Gravity.RIGHT);
		// } else {
		tvBangTab.setGravity(Gravity.CENTER);
		// }
		if (null != layoutParams) {
			tvBangTab.setLayoutParams(layoutParams);
		}
		return tvBangTab;
	}

	/**
	 * 
	 * @author:zhongwr
	 * @Description :初始化tab游标所需参数
	 * @param :
	 * @return :void
	 */
	private void initTabIndicator() {
		if (!Tools.isListEmpty(allBangTabList)) {
			int screenW = Tools.getScreenSize(this).x;// 获取分辨率宽度
			offset = screenW / allBangTabList.size();// 计算偏移量,每个item占据屏幕的宽度
			Matrix matrix = new Matrix();
			matrix.postTranslate(offset, 0);
			ivTabIndicator.setImageMatrix(matrix);// 设置动画初始位置
			ivTabIndicator.getLayoutParams().width = offset;
			ivTabIndicator.setVisibility(View.VISIBLE);
			if (!isMyBang) {// 如果不是bang,则选中的是这个下标
				startTabIndicatorAnim(currIndex);
			}
		}
	}

	/***
	 * 
	 * @Description : 请求帮类的第一页数据和所有tab的数据
	 * @author:zhongwr
	 * @param :
	 * @return :void
	 */
	private void requestAllTabAndBang() {
		showLoadingDialog(mContext);
		String url = null;
		if (isMyBang) {// 请求数据
			url = Define.host + Define.ALL_TAB_AND_MY_BANG;
			executorService.execute(new LmbRequestRunabel(this, 1, url, null, this));
		} else {
			url = Define.host + Define.ALL_TAB_AND_CATEGORY_BANG;
			LinkedHashMap<String, String> params = new LinkedHashMap<String, String>();
			params.put("cid", categoryId + "");
			params.put("mvc", "1");
			executorService.execute(new LmbRequestRunabel(this, 2, url, params, this));
		}
	}

	/**
	 * 请求开始时,执行
	 */
	@Override
	public void onStart(int type) {

	}

	@Override
	public void onFault(int type, String url, String result) {
		dismissLoading(mContext);
		setReloadVisiable();
	}

	@Override
	public void onSuccess(int type, String url, Map<String, String> params, String result) {
		try {
			Type classOfT = new TypeToken<LmbRequestResult<AllBangItem>>() {
			}.getType();
			LmbRequestResult<AllBangItem> r = new Gson().fromJson(result, classOfT);
			if ("0".equals(r.ret)) {// 成功
				setclickToReloadGone();
				parserALLBangResult(r);
				addTabsAndFragments();
				initTabIndicator();
				fragmentPagerAdapter.notifyDataSetChanged();
				vpFragmentContainer.setCurrentItem(currIndex);
			} else {
			}
			setReloadVisiable();
		} catch (JsonSyntaxException e) {
			e.printStackTrace();
			setReloadVisiable();
		} catch (Exception e) {
			e.printStackTrace();
			setReloadVisiable();
		} finally {
			dismissLoading(mContext);
		}
	}

	/**
	 * 
	 * @description 解析返回成功的数据
	 * @author zhongwr
	 * @update 2015-10-31 下午2:59:14
	 */
	private void parserALLBangResult(LmbRequestResult<AllBangItem> r) throws Exception {
		AllBangItem allBangTabItem = (AllBangItem) r.data;
		if (null != allBangTabItem) {
			myBangList = allBangTabItem.bang_list;// 如果不是b,则为null
			notMybangList = allBangTabItem.bang;
			BangCategoryContainerItem containerItem = allBangTabItem.bang_category;
			if (null != containerItem) {
				allBangTabList = containerItem.data;
				categoryId = containerItem.curr;
				if (null != allBangTabList && !allBangTabList.isEmpty()) {
					int i = 0;
					for (BangCategoryInfo categoryInfo : allBangTabList) {
						categoryInfo.tabIndex = i;
						if (containerItem.curr == categoryInfo.id) {//
							currIndex = i;
						}
						i++;
					}
				}
			}
		}
	}

	private List<Integer> joinOrExitList;

	/**
	 * 加b或者退出b成功
	 */
	@Override
	public void joinOrExitBangOk(int bid) {
		if (null == joinOrExitList) {
			joinOrExitList = new ArrayList<Integer>();
		}
		if (joinOrExitList.contains(bid)) {// key已经存在
			joinOrExitList.remove(bid);
		} else {
			joinOrExitList.add(bid);
		}
	}

	/**
	 * 
	 * @description 加帮或退帮操作:都要刷新我的帮
	 * @author zhongwr
	 * @update 2015-11-2 下午8:00:14
	 */
	protected boolean isJoinOrExitBang() {
		if (!Tools.isListEmpty(joinOrExitList)) {
			joinOrExitList.clear();// 清空加帮或退帮缓存数据
			return true;
		}
		return false;
	}

}
TabMyBangFragment extends TabBangBaseFragment优化如下:

TabMyBangFragment :

@Override
	public View onCreateViewComplete(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		if (null == cacheFragmentView) {
			View view = cacheFragmentView = inflater.inflate(R.layout.my_bang_fragment, null);
			mActivity = getActivity();
			initView(view);
			initListener();
			initData();
		}
<pre name="code" class="java">// <span style="color:#ff0000;">当viewpager滑动的时候,很容易就执行OnDetach()把当前的fragment的view销毁,但是没销毁fragment及属性,所以可以通过cacheFragemntView来缓存加载过的view,///当要恢复时,直接使用,不过需要注意的是需要先销毁父布局中child,详见:onDestoryView()</span>
return cacheFragmentView; }/*@Override 基类已经执行了,不用再次执行public void onDestroyView() {// super.onDestroyView();ViewGroup parent = (ViewGroup) cacheFragmentView.getParent();if (null != parent) {// 必须先清除父布局中的child,否则会报错“当前父布局已经有了一个child,不能再添加”parent.removeAllViewsInLayout();}}*/

 
TabBangBaseFragment: 

<span style="color:#333333;">private FrameLayout mViewContainer;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		if (null == mViewContainer) {
			View view = inflater.inflate(R.layout.mam_base_main, null);
			mViewContainer = (FrameLayout) view.findViewById(R.id.base_container);
		}
		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
				RelativeLayout.LayoutParams.MATCH_PARENT);
		clickToReload = new ClickScreenToReload(getActivity());
		clickToReload.setVisibility(View.GONE);
		mViewContainer.addView(onCreateViewComplete(inflater, mViewContainer, savedInstanceState), lp);
		mViewContainer.addView(clickToReload, lp);
		return mViewContainer;
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
		ViewGroup parent = (ViewGroup) mViewContainer.getParent();
		if (null != parent) {// 必须先清除父布局中的child,否则会报错“当前父布局已经有了一个child,不能再添加”
			mViewContainer.removeAllViewsInLayout();
			parent.removeView(mViewContainer);
		}
	}</span>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值