ListView.getCount() pk ListAdapter.getCount()
2016-05-25 13:34
281 查看
1.在app中我们通常使用adapter.getCount(),来获取当前ListView中数据的条数,今天发现ListView也有一个getCount()方法。他们可以互用吗?今天我们探究一下。
通过上面的例子,不断修改ListView addHeadView /addFootView方法发现
如果ListView没有headView&&没有endView,listView.getCount()=adapter.getCount()
如果ListView 有headView||endView中的一个, listView.getCount()=adapter.getCount()+1
如果ListView 有headView||endView中的一个, listView.getCount()=adapter.getCount()+2
在AdapterView中搜索发现,mItemCount的赋值为:
进入getAdapter()发现
这时就应该考虑AdapterView的子类,ListView或者ListView中的父类实现了方法
很明显,下一个要查看的是AbsListView了,AbsListView中没有实现,看一下ListView
这里面mAdapter出现的位置太多了,看一下ListView.setAdapter吧
mHeaderViewInfos是headView?
可见FixedViewInfo是addView的容器,而mHeaderViewInfos是保存addView 容器的列表,ok,现在我们要继续分析HeaderViewListAdapter:
ok,到此为止,可以完全确定listView.getCount()==adapter.getCount()+headView.getCount()+footView.getCount().
小Demo分析
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = new ListView(this); setContentView(lv); TextView headView = new TextView(this); headView.setText("headView"); lv.addHeaderView(headView); lv.addFooterView(headView); List<String> dataList = new ArrayList<String>(); for (int j = 0; j < 30; j++) { dataList.add("" + j); } ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, dataList); //绑定适配器 lv.setAdapter(arrayAdapter); int lvCount = lv.getCount(); int adapterCount = arrayAdapter.getCount(); System.err.println(""); } }
通过上面的例子,不断修改ListView addHeadView /addFootView方法发现
如果ListView没有headView&&没有endView,listView.getCount()=adapter.getCount()
如果ListView 有headView||endView中的一个, listView.getCount()=adapter.getCount()+1
如果ListView 有headView||endView中的一个, listView.getCount()=adapter.getCount()+2
源码分析
ListView.getCount()其实是AdapterView中的方法@ViewDebug.CapturedViewProperty public int getCount() { return mItemCount; }
在AdapterView中搜索发现,mItemCount的赋值为:
mItemCount = getAdapter().getCount();
进入getAdapter()发现
public abstract T getAdapter();
这时就应该考虑AdapterView的子类,ListView或者ListView中的父类实现了方法
很明显,下一个要查看的是AbsListView了,AbsListView中没有实现,看一下ListView
@Override public ListAdapter getAdapter() { return mAdapter; }
这里面mAdapter出现的位置太多了,看一下ListView.setAdapter吧
@Override public void setAdapter(ListAdapter adapter) { if (mAdapter != null && mDataSetObserver != null) { mAdapter.unregisterDataSetObserver(mDataSetObserver); } resetList(); mRecycler.clear(); if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter; } ...
mHeaderViewInfos是headView?
public void addHeaderView(View v) { addHeaderView(v, null, true); } public void addHeaderView(View v, Object data, boolean isSelectable) { final FixedViewInfo info = new FixedViewInfo(); info.view = v; info.data = data; info.isSelectable = isSelectable; mHeaderViewInfos.add(info); ...
可见FixedViewInfo是addView的容器,而mHeaderViewInfos是保存addView 容器的列表,ok,现在我们要继续分析HeaderViewListAdapter:
public int getCount() { if (mAdapter != null) { return getFootersCount() + getHeadersCount() + mAdapter.getCount(); } else { return getFootersCount() + getHeadersCount(); } } public int getHeadersCount() { return mHeaderViewInfos.size(); }
ok,到此为止,可以完全确定listView.getCount()==adapter.getCount()+headView.getCount()+footView.getCount().
相关文章推荐
- AutoCompleteTextView诡异之处
- 利用session生成bootstrap下拉列表
- Linux 路由表功能解析
- 将Apache James服务启动程序注册为系统服务
- 锁的优化和注意事项
- 解决webview中输入框完成输入隐藏键盘后滑动界面又弹出软键盘问题
- 实时分析 HTTP/HTTPS 数据流(HTTP Analyzer)
- java之持有对象
- ACM杭电专题三1007
- HTTP Analyzer(实时分析HTTP/HTTPS数据流)
- 64位Ubuntu中QQ不能输入中文的解决办法
- 动态存储分配及深复制 —字符串的复制
- 0525Sprint回顾
- centos6.5 redis3 开机自动启动命令设置
- 《数据结构》3.1双栈--按栈号进行操作
- 数据分析与挖掘 - R语言:贝叶斯分类算法(案例一)
- table表头thead固定
- 进制转换2
- jsp9种内置对象
- 图文浅谈Struts2框架的执行流程