ListView.getCount() pk ListAdapter.getCount()

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中的父类实现了方法
ListView.getCount() pk ListAdapter.getCount()_第1张图片
很明显,下一个要查看的是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().

你可能感兴趣的:(源码浅析)