向行添加按钮后,ListView行无法单击

时间:2013-09-19 20:19:33

标签: android android-listview

目前,我有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原始点击事件不同。

enter image description here

在我的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");
        }
    });

enter image description here

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

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

2 个答案:

答案 0 :(得分:14)

如果您想要可点击行和按钮,请设置

android:focusable="false"

用于按钮。 ImageButtons,RadioButtons ......也是如此。

  

Android主要是为大量输入法设计的。   整个系统完全无需触摸即可工作   屏幕。要在UI中导航,用户可以使用方向键盘   当且仅当这些视图是视图时,才会关注视图之后的视图   可获得焦点。 默认情况下,所有Android控件都是可调焦的。为了   阻止具有焦点无法访问的控件ListView   只会阻止选择(和点击)项目视图。通过   设计, ListView阻止包含至少一个的itemview 的点击   可聚焦的后代,但它不会使内容焦点可达   调用setItemsCanFocus(true)。

以下是完整的解释: Having several clickable areas in a ListView

答案 1 :(得分:0)

It's worth noting that the preferred way (even according to the link provided in the accepted answer) is to set the android:descendantFocusability attribute to block focus from the root layout you're inflating within the adapter. There can be potential situations where simply setting the focusable attribute to false on an individual element won't solve the problem, but the descendantFocusability attribute will.