7

目前,我有一ListView排。单击行上的任何区域,将产生ListView单击事件。

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        this.getListView().setMultiChoiceModeListener(new ModeCallback());
        this.getListView().setOnItemClickListener(new ListViewOnItemClickListener());
    } else {
        // http://stackoverflow.com/questions/9754170/listview-selection-remains-persistent-after-exiting-choice-mode
        this.getListView().setOnItemLongClickListener(new ListViewOnItemLongClickListener());
        this.getListView().setOnItemClickListener(new ListViewOnItemClickListener());
    }

现在,对于每一行,我想添加一个小按钮。点击小按钮会产生按钮点击事件,这与ListView原来的点击事件不同。

在此处输入图像描述

在我的ArrayAdapter,我曾经有

public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;

    if (rowView == null) {
        LayoutInflater inflater = activity.getLayoutInflater();
        rowView = inflater.inflate(R.layout.watchlist_row_layout, null);
        ...
    }

    Button button = (Button)rowView.findViewById(R.id.button1);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Utils.showLongToast("BUTTON CLICK");
        }
    });

在此处输入图像描述

单击按钮将产生按钮单击事件。但是,单击按钮以外的区域将不再产生任何ListView单击事件。

我可以知道为什么会这样吗?有没有办法解决这个问题?

4

2 回答 2

14

如果你想让Rows 和 Buttons 都可以点击,设置

android:focusable="false"

为您的Button。ImageButtons、RadioButtons、...

Android 主要是为大量输入法设计的。整个系统完全能够在没有触摸屏的情况下工作。要在 UI 中导航,当且仅当这些视图可聚焦时,用户可以使用方向键将视图聚焦在视图之后。默认情况下,所有 Android 控件都是可聚焦的。为了防止出现无法获得焦点的控件,ListView 将简单地阻止对 itemview 的选择(和单击)。根据设计, ListView 会阻止对包含至少一个可聚焦后代的 itemview 的点击,但它不会使调用 setItemsCanFocus(true) 的内容可达到焦点。

这是完整的解释:在 ListView 中有几个可点击的区域

于 2013-09-19T20:21:50.117 回答
0

值得注意的是,首选方法(即使根据接受的答案中提供的链接)是设置 android:descendantFocusability 属性以阻止您在适配器中膨胀的根布局的焦点。在某些情况下,简单地将单个元素的 focusable 属性设置为 false 并不能解决问题,但 descendantFocusability 属性可以。

于 2016-08-31T16:51:20.490 回答