zoukankan      html  css  js  c++  java
  • 原 [Android]LIstView的HeaderView

    目录[-]

    (1)添加HeaderView之后尺寸布局被忽略。

    通常添加头部的方法是 
    1
    2
    3
    LayoutInflater lif = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View headerView = lif.inflate(R.layout.header, null);
    mListView.addHeaderView(headerView);

    原因: 
    lif.inflate(R.layout.header, null)丢失了XML布局中根View的LayoutParam,应该使用的是 
    1
    lif.inflate(R.layout.header, mListView, false);

    (2)添加HeaderView之后导致OnItemClickListener的position移位

    OnItemClickListener接口的方法: 
    1
    void onItemClick(AdapterView<?> parent, View view, int position, long id)

    position通常是从0开始的,但是添加了HeaderView之后,position也会将HeaderView的数目计算进去。 
    几个解决办法: 
    1,手动计算真实的position位置: 
    1
    2
    3
    4
    5
    6
    7
    8
    final headerCount = 1;
    mListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Item item = myAdapter.getItem(position - headerCount);
        }
    });

    2,其实上面的步骤ListView已经为我们提供了,所以可以改写为: 
    1
    2
    3
    4
    5
    6
    7
    mListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Item item = parent.getAdapter().getItem(position);
        }
    });
    原因在源码中有比较清晰的解释: 
    当有headerView被添加时,实际传递给ListView的adapter被包装,parent.getAdapter()返回真实被ListView使用的Adapter(HeaderViewListAdapter),HeaderViewListAdapter的getItem(int)方法处理了position的问题。 

    (3)LayoutInflater的infalte()

    用来呼应第一个问题。LayoutInflater的作用很简单,就是将XML的布局文件“翻译”成相应的View对象,而且出于性能的考虑,LayoutInflater只能处理编译后的XML文件,而不能处理通常明文编码的XML文件。 
    最常用的一个方法: 
    1
    View inflate(int resource, ViewGroup root, boolean attachToRoot)

    其中: 
    resource是布局文件ID 
    root是父ViewGroup对象, 
    attachToRoot是是否将“翻译”出来的View添加到上面的root中 

    root和attachToRoot是共同作用的: 
    1,有root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view 
    2,有root,同时attachToRoot为true,那么inflate()就是将“翻译”得到的view添加到root后,然后返回root 
    3,无root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view。 
    4,无root,同时attachToRoot为true,报错。 

    另外,root还有一个重要的作用就是为“翻译”得到的view添加合适的LayoutParam,并且如果并不想将得到的View添加到root的话,传递何种root是并没有要求的,比如: 
    1
    2
    3
    View view = mLayoutInflater.inflate(R.layout.header, new ListView(mContext), false);
    View view = mLayoutInflater.inflate(R.layout.header, new LinearLayout(mContext), false);
    View view = mLayoutInflater.inflate(R.layout.header, new RelativeLayout(mContext), false);
    上面得到的View,除了view的LayoutParam分别为AbsListView.LayoutParams,LinearLayout.LayoutParams,RelativeLayout.LayoutParams之外,内容都一致。 
  • 相关阅读:
    C++如何在Dialog和View中显示梯度背景颜色
    C++MFC的关键类(View,Application,Frame,Document等等)之间访问方法列表
    C++深入分析MFC文档视图结构(项目实践)
    C++如何修改SDI程序的默认背景颜色
    BAPI使用HR_INFOTYPE_OPERATION函数批量导入HR信息纪录代码样例(0759信息类型)
    C++在单文档的应用程序增加多个视图
    SD定价过程的16个字段的作用说明
    HR上载信息类型的长文本的样例代码
    C++在工具条中加入组合框控件
    C++如何锁定splitter窗口
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4290032.html
Copyright © 2011-2022 走看看