Android Fragment 切换多个界面 重叠问题 隐藏问题

      接上一篇的博文:Android fragment 切换载入数据卡顿问题。想到的办法就是把切换之前的fragmenthide隐藏起来。就能够解决卡顿的问题,不用又一次new一个fragment。因为左側悬浮菜单有几乎相同10多个菜单,假设每个菜单切换的时候,都要隐藏其余全部的菜单,那就会导致代码十分的臃肿,曾经隐藏的代码是这种:

				/*if (!openPositionFragment.isAdded()) { // 先推断是否被add过
					transaction.hide(priceFragment)
							.add(R.id.fragment_container, openPositionFragment)
							.commit(); // 隐藏当前的fragment。add下一个到Activity中
					titleView.setText(openPositionFragment.getFragmentTitle());
				} else {
					transaction.hide(priceFragment).show(openPositionFragment)
							.commit(); // 隐藏当前的fragment,显示下一个
					titleView.setText(openPositionFragment.getFragmentTitle());
				}*/

    每个菜单button下的点击事件,都要写一段这种代码,并且局限是仅仅能隐藏一个。导致切换的时候有重叠问题,无法正确显示。

   解决的方案是:

         先隐藏全部的fragment,然后进入点击事件,假设该fragment已经实例化,那就show就好,假设没有还未实例化,那就先new一个,然后show,最后一定记得commit。我就是因为没写这句代码导致空指针异常。

另一点注意的是必须先实例化你第一个进入的fragment。

改动之后的代码例如以下:

private void initOpenMenuItem(View popupWindow_view) {
		DrawableCenterTextView menu_price = (DrawableCenterTextView) popupWindow_view
				.findViewById(R.id.menu_price);

		menu_price.setOnClickListener(new OnClickListener() {
			FragmentTransaction transaction;

			@Override
			public void onClick(View v) {
				progressDialog.show();
				
				transaction = manager.beginTransaction();
				hideFragments(transaction);
				/*
				 * qiulinhe:2015年7月21日10:54:51 解决切换卡顿的问题
				 */

				if (priceFragment == null) {  
	                // 假设MessageFragment为空,则创建一个并加入到界面上  
					priceFragment = new PriceFragment();  
	                transaction.add(R.id.fragment_container, priceFragment);  
	                titleView.setText(priceFragment.getFragmentTitle());
	            } else {  
	                // 假设MessageFragment不为空,则直接将它显示出来  
	                transaction.show(priceFragment); 
	                titleView.setText(priceFragment.getFragmentTitle());
	            }

				transaction.commit();
				popupWindow.dismiss();
				progressDialog.dismiss();
			}
		});

	}

	/** 
     * 将全部的Fragment都置为隐藏状态。 
     *  
     * @param transaction 
     *            用于对Fragment运行操作的事务 
     */  
    private void hideFragments(FragmentTransaction transaction) {  
    	
        if (priceFragment != null) {  
            transaction.hide(priceFragment);  
        }  
        if (openPositionFragment != null) {  
            transaction.hide(openPositionFragment);  
        }  
        if (closeHisFragment != null) {  
            transaction.hide(closeHisFragment);  
        }  
        if (orderHisFragment != null) {  
            transaction.hide(orderHisFragment);  
        }  
    }  
      这样就能够解决fragment切换重叠,无法正常显示的问题。

只是这里提一个问题,就是hide方法运行之后,被隐藏的fragment。假设后台在获取数据。刷新界面,是否会导致数据太多,程序崩溃的问题?

        经过后台打印的时候,的确显示的当前fragment更新数据。但那些隐藏的fragment仍然在后台执行,这势必导致内存越来越被占用。

   怎样解决?

2015年8月14日10:23:44:今天最终找到了解决方式:

    之前监听数据变化。是依据数据变化的监听器变化,发送了一个事件,fragment接收到了之后,又一次绑定数据源。载入数据。更新listview列表项。我的处理方法非常笨:定义了一个map,存放每一个行的数据。当数据以来。我就map.removeall(map),然后又一次载入整个列表项。一開始数据少。更新慢。不会影响长按操作,后期測试的时候。数据变化非常快。就导致了长按button无法正常使用的问题。

     同事提供了一个非常好的解决方式就是:推断数据源里的数据和如今展示出来的列表数据,哪些是发生了变化。这样仅仅更新变化的几个字段。就不会导致又一次载入之后。数据刷新太快,导致长按无法使用。

@Override
public void onTradeChanged(Long ticket) {
isHidden();
// 假设交易發生變化,則從新獲取開倉數據
System.out.println(ticket + " ===== ");
if (!isHidden()) {  //这个就是fragment就是推断当前fragment是否隐藏,假设已经隐藏了。就不在后台更新数据,不接受更新
onTradeDataChange(ticket);
}
}


=========================更新时间2016年2月26日11:00:25:添加怎样更新map中的部分数据,避免先所有删除map的数据,代码例如以下:

	// 
	private void onTradeDataChange() {
		updateTableData();
		fireTableDataChange();
	}

	public void fireTableDataChange() {
		getHandler().post(new Runnable() {
			@Override
			public void run() {

				// tableAdapter.notifyDataSetInvalidated();
				if (tableAdapter != null) {
					tableAdapter.notifyDataSetChanged();

				}
			}
		});
	}

	/**
	 * 
	 * @Title:?updateTableData
	 * @Description:?

数据發生變化 * @param? * @return?void * @throws?

? */ private void updateTableData() { dataMap.clear(); TTrade[] tradeVec = getTradeVec(); for (TTrade trade : tradeVec) { // if (!isExsitsTicketSplitno(trade)) { HashMap<String, Object> rowData = addTradeNode(trade); dataMap.add(rowData); // } else { // HashMap<String, Object> rowData = removeOpenPosition(trade); // if (rowData != null) { // dataMap.remove(rowData); // } // } } // 依照系统设置传递过来的数据进行排序 sortOrderHisByAll(oppsortInt); } /** * * @Title:?updateTableData * @Description:?来数据时,更新 * @param?@param instrumentName * @return?void * @throws??

*/ private void updateTableData(String instrumentName) { for (HashMap<String, Object> rowData : dataMap) { String instName = rowData.get(Instrument).toString(); if (instrumentName.equalsIgnoreCase(instName)) { long ticket = Long.parseLong(rowData.get(Ticket).toString()); TTrade trade = APIDoc.getUserDocCaptain().getTrade(ticket); if (trade != null) { rowData.put(FloatPL, trade.get_floatPL()); rowData.put(MktPrice, trade.get_marketPrice()); } } } }




posted @ 2017-07-09 18:09  jzdwajue  阅读(534)  评论(0编辑  收藏  举报