ListActivity源码详解
前言
最近在研究PreferenceActivity
发现是继承自ListActivity的,打开看了下ListActivity
的源码,发现也不长,就详细阅读认识一下。
正文
ListActivity
简单到只要在onCreate()
中调用setListAdapter()
方法就可以实现了。
支持空数据显示。
点进去我们看到前两个field
很熟悉,就是一个ListView
+Adapter
。
很容易就知道这两个field
就是ListActivity
的核心,数据存储在Adapter
中,展示在ListView
中。
1 | protected ListAdapter mAdapter; |
在调用了setListAdapter()
之后,对Adapter
重新赋值,并重新设置ListView
的Adapter
,并且调用了ensureList()
方法,重新创建布局。
点进ensureList()
方法。
1 | private void ensureList() { |
哈!原来每次setListAdapter()
都会把Adapter
替换掉,并且重新setContentView()
,怪不得ListActivity
不用我们操心布局。
我们再来看看这个布局的内容
1 | <ListView xmlns:android="http://schemas.android.com/apk/res/android" |
也就是说,你可以自己setContentView()
,只要你的布局有一个viewId
是android:id="@android:id/list"
的就行。
看到这你可能会无语,就一个简单的ListView
就完事了?这么简单我也会啊!
别急,这只是完成了基本的功能而已,还要开放一些接口给子Activity
调用。
有了ListView
当然要实现各种事件啊。
1 | public void setSelection(int position) { |
当然还有点击事件,我们发现有一个点击的监听器mOnClickListener
。
1 | private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { |
既然有监听器,那又是在哪里设置了这个监听器呢?我们发现有一个onContentChanged()
方法。
1 | public void onContentChanged() { |
可是翻遍源代码也没发现哪里调用了onContentChanged()
。
从字面上看,onContentChanged()
是Content
改变时的回调接口,等等,Content
?
我们不是在ensureList()
中调用了setContentView()
方法吗?
答案是正确的,在调用了setContentView()
,会调用onContentChanged()
。
1 | // Activity的setContentView()调用Window(具体子类是PhoneWindow)的setContentView()方法 |
再解释下,上面的mHandler.post(mRequestFocus);
1 | private Runnable mRequestFocus = new Runnable() { |
至此,ListActivity
已经认识的差不多了。有什么讲错了希望能有大牛来提点一下。
有兴趣的可以自己用recyclerView
替换listView
实现一个RecyclerActivity
.