您的位置:首页 > 其它

ListView.getCount() pk ListAdapter.getCount()

2016-05-25 13:34 281 查看
1.在app中我们通常使用adapter.getCount(),来获取当前ListView中数据的条数,今天发现ListView也有一个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().
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  源码浅析