最近开发一直在使用ListFragment,ListFragment有一个 setListShown(boolean shown)的方法,当传入参数为false的时候,ListFragment显示一个进度条,然后在这段时间时间里面可以异步加载数据,然后等到数据加载完成以后再次调用 setListShown(true),然后隐藏进度条,显示ListView。
但是这个方法必须在 ListView已经创建以后才可以,否则就会抛出一个“Content view not yet created”,也就是 最好调用这个方法是在 OnActivityCreated之后和 OnDestroy之前。最近笔者在使用它的时候因为在 OnActivityCreated 使用了一个 AsyncTask来异步加载数据,但是有时候莫名其妙程序就会挂掉,然后在Log里看到“Content view not yet Created”,各种查资料都没有解决问题,程序还是时不时就挂了不知道,然后留下一个“Content view not yet Created”孤零零地躺在Logcat里面。
后来笔者突然想起来,ListFrament维护的listview在 onCreateView时候被创建,但是在 OnDestroy之后就被销毁了,会不会是因为异步加载数据的时候,当数据加载完成以后,ListFragment已经被Destroy了,所以当在AsyncTask的 doInBackgroud方法(在子先撑)执行完毕之后,onPostExecute里面调用 setListShown的时候,listView已经不存在,所以程序才crash掉呢?
经过测试发现,原因就是这样。
这种情况比较容易出现的情况是ViewPaper和ListFragment混合使用并且ListFramgnt是通过异步加载数据的时候,因为 ViewPaper能缓存的页面数量是有限的(通过ViewPaper.setOffscreenPageLimit(int limit)来控制),当ViewPaper滑动到Limit之外的时候 之前缓存的ListFragment就会被销毁,这个时候 因为之前的ListFragment的AsyncTask已经开始执行,当执行结束的时候 发现 ListView已经销毁,所以再调用 setListShown()的时候,程序就crash了。
解决的办法就是在ListFragment的 onStop方法(onDestroy之前)里面把正在执行的 AsyncTask cancel掉,这样就不会再调用setListShown了。
分享到:
相关推荐
public void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(getActivity(), "点击了" + position, Toast.LENGTH_SHORT).show(); } } ``` 在实际项目中,开发者可以根据需求灵活...
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = items.get(position); Toast.makeText(getActivity(), "Clicked on " + item, Toast.LENGTH_SHORT).show();...
**ListFragment:Android开发中的列表视图组件** 在Android应用开发中,`ListFragment`是Android SDK提供的一种特殊类型的Fragment,专门用于展示列表数据。它继承自`Fragment`类,并集成了`ListView`的功能,使得...
在Android开发中,`ListFragment`是Android Support Library或AndroidX库中的一种组件,它用于在界面中展示列表数据。`ListFragment`是`Fragment`的子类,它集成了`ListView`的功能,使得开发者可以更方便地在应用中...
在Android开发中,`ListFragment`是一个非常实用的组件,它是`Fragment`的子类,专为在界面上显示一个可滚动的列表而设计。本文将深入探讨如何自定义`ListFragment`以满足特定需求,并结合给定的标签“源码”和...
在Android应用开发中,`ListFragment` 是一个非常实用的组件,它继承自 `Fragment` 类,主要用于在界面上展示列表数据。在这个场景中,我们看到的项目是关于使用 `ListFragment` 来显示莎士比亚的作品。让我们深入...
标题"左边listfragment显示标题右边fragment显示内容"正是描述了这样一个场景,它强调在手机横屏模式下,使用Fragment而非Activity来展示内容。 Fragment是Android SDK中的一个组件,它允许开发者在单个Activity中...
本实例将探讨如何在Fragment中使用ListFragment,实现ListView的下拉刷新、上拉加载以及横向滑动事件监听。 1. **Fragment基本概念**: Fragment是一个可嵌入到Activity中的UI片段。它可以有自己的生命周期,接收...
在Android应用程序开发中,ListFragment是Android SDK提供的一种特殊类型的Fragment,它的主要功能是展示一个列表视图(ListView)。ListFragment简化了在Activity中集成列表展示的流程,因为它内置了对ListView的...
上一篇文章介绍了ListFragment,其中的ListView并没有自定义适配器,实际上在实际开发中常会用到自定义适配器,是实现更复杂的列表数据展示。所以这篇文章增加了自定义适配器,来进行ListView数据的展示
1、fragment简介 我对fragment的理解是基于activity的,对于大多数的基本开始发时,我们最先遇到的就是用activity来开发。 ...2、ListFragment实例讲解 最终效果 最终效果如上图所示 2.1、首先我
在Android开发中,`ListFragment`是Android Support Library或AndroidX库的一部分,它是一个轻量级的组件,用于在活动中展示列表数据。`ListFragment`是`Fragment`的一个子类,专为显示`ListView`而设计,简化了在...
然而,当涉及到在`Fragment`中添加`ListView`时,开发者通常会遇到一个问题,那就是不应该直接使用`ListFragment`。本篇文章将解释为什么在`Fragment`中添加`ListView`时不推荐使用`ListFragment`,并提供一种替代的...
在Android开发中,`ListFragment`是Android Support Library(现在称为AndroidX库)的一部分,它是一个简化版的`Fragment`,专门用于展示列表视图。`ListFragment`结合了`ListView`的功能和`Fragment`的灵活性,使得...
移动互联网应用
8. **布局嵌套**: `ListFragment`可以与其他`Fragment`或者View一起在Activity的布局文件中嵌套使用,构建复杂的UI结构。 9. **数据更新**: 当数据源发生变化时,可以通过调用`adapter.notifyDataSetChanged()`通知...
本教程将详细介绍如何基于ListFragment框架来实现这一功能,这对于初学者来说是一个很好的实践项目,能够帮助巩固和提升Android开发的基本技能。 首先,我们需要理解ListFragment的概念。ListFragment是Android ...
- `onListItemClick(ListView l, View v, int position, long id)`:`ListFragment`提供此回调方法,当用户点击列表项时会被调用。开发者可以在此处理点击事件,如跳转到新页面或执行其他操作。 5. **集成到应用**...