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中的父类实现了方法
这里写图片描述
很明显,下一个要查看的是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().

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值