首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ListView addHeaderView导致位置增加1?

ListView addHeaderView导致位置增加1?
EN

Stack Overflow用户
提问于 2012-06-20 01:41:45
回答 11查看 34.2K关注 0票数 98

下面是一个带有ListView的代码片段。我添加了一个emptyView和一个headerView。添加headerView会导致onItemClick中的位置增加1。

因此,如果没有headerView,第一个列表元素的位置将为0,而使用headerView时,第一个列表元素的位置将为1!

这会在我的适配器中导致错误,例如在调用getItem()和使用其他一些方法时,请参见下面的内容。奇怪的是:在适配器的getView()方法中,请求的第一个列表元素的位置为0,即使添加了headerView!!

代码语言:javascript
复制
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
    View emptyView = viewSwitcher.findViewById(R.id.empty);
    list.setEmptyView(emptyView);

    View sectionHeading = inflater.inflate(R.layout.heading, list, false);
    TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
    sectionHeadingTextView.setText(headerText);
    list.addHeaderView(sectionHeading);

    list.setAdapter(listAdapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            listAdapter.getItem(position);
            //Do something with it
        }
    });
}

一些适配器方法:

代码语言:javascript
复制
@Override
public int getViewTypeCount() {
    return TYPE_COUNT;
}

@Override
public int getItemViewType(int position) {
    return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}

    @Override
public Product getItem(int position) {
    return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return (position < items.size());
}

这是添加headerView时的正常行为吗?如何克服我的适配器中的问题?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-11-16 00:56:12

我刚刚遇到了这个问题,最好的方法似乎是使用ListView.getItemAtPosition(position)而不是ListAdapter.getItem(position),因为ListView版本说明了标题,即:

改为执行以下操作:

代码语言:javascript
复制
myListView.getItemAtPosition(position)
票数 113
EN

Stack Overflow用户

发布于 2013-04-17 22:10:33

如果你不关心点击标题,从位置减去标题视图的数量,就可以得到适配器的位置:

代码语言:javascript
复制
        listView.addHeaderView(inflater.inflate(
                R.layout.my_hdr_layout, null), null, false);
        listView.setAdapter(m_adapter);
        listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            position -= listView.getHeaderViewsCount();
            final MyObject object = m_adapter.getItem(position);

        }
    });
票数 32
EN

Stack Overflow用户

发布于 2012-06-20 01:55:31

如果将标头添加到ListView,则它将成为列表中的第一项。您可以通过覆盖getCount()以少返回一个项来弥补这一点,但请确保处理getItem()getItemId()等,因为标头将是位置0中的项。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11106397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档