ListView条目焦点获取不到问题解决

来源:互联网 发布:flash播放器mac版 编辑:程序博客网 时间:2024/05/16 18:05
   项目开发中 ListView 是非常常见的控件,我们在使用ListView的时候往往要展示比较复杂的Item,如果Item中有Button或者CheckBox等会抢夺焦点的控件的时候. 虽然我们设置的onItemClickListener,但是我们点击条目,仍然不会有点击事件,原因就是Button等控件抢夺了Item的焦点.

比如下边的代码 :

 <-- MainActivity的布局 -->  <?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.joker.listviewitemdemo.MainActivity">    <ListView        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="match_parent"        /></RelativeLayout>
<-- ListView的条目布局 --><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="horizontal">    <TextView        android:id="@+id/tv_item"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <-- 会抢夺Item的焦点控件 -->    <Button        android:id="@+id/btn1_item"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Button1"        />    <Button        android:id="@+id/btn2_item"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Button2"        /></LinearLayout>
<-- getView中设置了Button的点击事件 -->        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHoler viewHoler = null;            if (convertView == null){                convertView = View.inflate(MainActivity.this, R.layout.item, null);                viewHoler = new ViewHoler();                viewHoler.mTextView = (TextView) convertView.findViewById(R.id.tv_item);                viewHoler.mButton1 = (Button) convertView.findViewById(R.id.btn1_item);                viewHoler.mButton2 = (Button) convertView.findViewById(R.id.btn2_item);                convertView.setTag(viewHoler);            }else {                viewHoler = (ViewHoler) convertView.getTag();            }            viewHoler.mTextView.setText(objects.get(position));            viewHoler.mButton1.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    Toast.makeText(MainActivity.this, "点击了按钮1....", Toast.LENGTH_SHORT).show();                }            });            viewHoler.mButton2.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    Toast.makeText(MainActivity.this, "点击了按钮2....", Toast.LENGTH_SHORT).show();                }            });            return convertView;        }
// 设置了ListView的条目点击事件mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                Toast.makeText(MainActivity.this, "点击了条目", Toast.LENGTH_SHORT).show();            }        });
    如果仅仅是这样,我们在运行之后发现,2个Button的点击事件是可以触发的,但是Item的事件不会触发.**解决方法:**    1. 在xml中设置Button的android:focusable="false", 这样Button就不会去抢夺焦点了. 2. 在getView()中设置Button不去获取焦点, btn.setFocusable(false). 3. 设置item的根布局的配置android:descendantFocusability="blocksDescendant"三种方式都可以解决ListView条目失去焦点的问题.
1 0
原创粉丝点击