Android:无法获得可点击的ListView页眉/页脚

时间:2012-01-11 21:09:32

标签: java android listview header onclick

我正在尝试在列表视图中设置可点击按钮的页眉和页脚。问题是OnClickListener没有响应任何东西,我无法弄清楚我做错了什么。

$   View header = getLayoutInflater().inflate(R.layout.header_layout, null, true);
    getListView().addHeaderView(header);

    myAdapter = new myAdapter(this);

    header.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do what I want when i click it
        }
    });

更新
我最终想出的最佳解决方案是在标题布局中添加一个单独的按钮,然后像这样做:

View header = getLayoutInflater().inflate(R.layout.header_layout, null);
Button headerButton = (Button)header.findViewById(R.id.header_button);
getListView().addHeaderView(header);

headerButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
     // My Click Stuff
     }
});

6 个答案:

答案 0 :(得分:9)

您需要处理ListView的{​​{1}}中的点击。只需检查这是onItemClick中的第一个或最后一个项目,并以这种方式处理点击。您需要将其视为adapter中的项目。

答案 1 :(得分:4)

我看到一些问题:

  • 在给标题膨胀时,使用getListView()作为第二个参数(root,你现在有空)l
  • 标题应该是View还是ViewGroup?在这些情况下我最终使用了ViewGroup。
  • 最后 - 也许你应该在标题中的按钮而不是标题本身上设置点击监听器?

答案 2 :(得分:3)

有一种更简单的解决方案:

只需将“OnClickListener”设置为应用的视图:

View view = inflater.inflate(R.layout.xxx, null);
view.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        //do something
    }
});

很容易解决它的事情!

答案 3 :(得分:2)

页脚示例:

mYourListView.addFooterView(footer, null, true);

然后在OnItemClickListener中,您可以检查:

@Override
public void onItemClick(AdapterView<?> parent,
                            View view, final int position, final long id) {

    if (id != -1) {
        // do whatever you do with list items
    } else {
        // do what you need after the footer been clicked
    }

(如果您需要处理并且页眉和页脚单击,请检查位置 - 0表示页眉,[adapter.getCount() - 1表示页脚)

此方法将在页脚单击时提供相同的视觉效果,就像单击列表项一样。 (但是,如果你不需要这种效果,只需将OnClickListener添加到页脚,它将拦截所有页脚点击)

答案 4 :(得分:0)

对我有用的是什么:

在对标题视图进行膨胀之前,在将其添加到列表视图之前,我使用该视图获取子视图并在其上添加单击侦听器

myHeaderView.findViewById(R.id.myButton).setOnClickListener(new OnClickListener() { ... } );

另外,当我将它添加到listView时,我使用了重载的构造函数,第三个变量设置为true

mListView.addHeaderView(myHeaderView, null, true);

答案 5 :(得分:0)

正如@LuxuryMode所说,你应该处理ListView的onItemClick。以下是如何做到这一点:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) {

// if statement

}

获取标题:

if (position == 0) { )

获取页脚:

if (position == adapter.getCount()) { ) // if there is no header
if (position == adapter.getCount() + 1) { ) // if there is a header

还有其他方法可以做到这一点。以下是您可以比较的一些事项:

arrayList.size() // number of items in the array (if your adapter is using an array)
cursor.getCount() // number of data items in the cursor (if your adapter is using a cursor)
adapter.getCount() // number of data items passed in by the cursor (or at least that is what a custom adapter should report)
listview.getCount() // number of data items from the adapter + a header and/or footer view

因此,使用页眉或页脚会使listview.getCount()比cursor.getCount()大1。如果同时使用页眉和页脚,那么它将大于2。