当前位置: 代码迷 >> Android >> Android fragment 切换加载数据卡顿有关问题
  详细解决方案

Android fragment 切换加载数据卡顿有关问题

热度:560   发布时间:2016-04-27 23:54:18.0
Android fragment 切换加载数据卡顿问题

      接着上一篇项目的进度,上一篇讲了如何利用fragment来实现下拉菜单,公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法,但加载的数据太多,用户从一个界面切换到这个界面的时候,至少有一两秒的卡顿,这是无法忍受的,代码如下:

private void initOpenMenuItem(View popupWindow_view) {<span style="white-space:pre">		</span>DrawableCenterTextView menu_price = (DrawableCenterTextView) popupWindow_view<span style="white-space:pre">				</span>.findViewById(R.id.menu_price);<span style="white-space:pre">		</span>menu_price.setOnClickListener(new OnClickListener() {<span style="white-space:pre">			</span>FragmentTransaction transaction;<span style="white-space:pre">			</span>@Override<span style="white-space:pre">			</span>public void onClick(View v) {<span style="white-space:pre">				</span>transaction = manager.beginTransaction();<span style="white-space:pre">				</span><span style="background-color: rgb(255, 255, 0);"><span style="font-size:18px;color:#ff0000;"><strong>transaction.replace(R.id.fragment_container, priceFragment);</strong></span></span><span style="white-space:pre">				</span>titleView.setText(priceFragment.getFragmentTitle());<span style="white-space:pre">				</span>transaction.commit();<span style="white-space:pre">				</span>popupWindow.dismiss();<span style="white-space:pre">			</span>}<span style="white-space:pre">		</span>});<span style="white-space:pre">	</span>}
     上述代码在切换fragment界面的时候,根据fragment的方法api,replace是要重新生成实例的,这就势必导致数据重新加载,我们必须得采取隐藏的方式或者加一个进度条来缓解。这里我采用的是fragment提供的hide方法,来实现数据的快速显示,修改代码如下:

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) {				transaction = manager.beginTransaction();				/*				 * qiulinhe:2015年7月21日10:54:51				 * 解决切换卡顿的问题				 */				<span style="font-size:18px;color:#333333;"><strong style="background-color: rgb(192, 192, 192);">if (!priceFragment.isAdded()) {    // 先判断是否被add过	                transaction.hide(openPositionFragment).add(R.id.fragment_container, priceFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中	                titleView.setText(priceFragment.getFragmentTitle());				} else {	                transaction.hide(openPositionFragment).show(priceFragment).commit(); // 隐藏当前的fragment,显示下一个	                titleView.setText(priceFragment.getFragmentTitle());</strong></span><span style="color:#c0c0c0;">				}</span>								popupWindow.dismiss();			}		});	}
       原理就是:

翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。

正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。
这样就能做到多个Fragment切换不重新实例化:


            由于是公司项目,不能上传整个工程文件,不过可以参考一下我的解决方式,有同样的问题的同学可以交流一下还有没有更优雅的解决办法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案