这里有三种解决方案
1.将ListView中的Item布局中的子控件focusable属性设置为false
2.在getView方法中设置button.setFocusable(false)
3.设置item的根布局的属性android:descendantFocusability="blocksDescendant"
我们可以发现,其实这三种方法都是为了让Button等控件不能获取焦点,从而使得item可以响应点击事件。
第三种方法使用起来相对方便,因为它是将item布局中的其他所有控件都设置为不能获取焦点。
android:descendantFocusability属性共有三个取值,分别为
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点
如果不想要checkBox点击UI变化或item上的Button类控件变化,直接设置clickable = “false”,则点击item时直接响应onItemClick()方法,但是如果在getView设置了监听,则还会回响应对应的item里的button类控件
如果设置了属性为其他子空间的属性为focusable = “false”,则可以通过在适配器中对子空间进行操作中
xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="70dp"> <CheckBox android:layout_width="15dp" android:layout_height="15dp" android:id="@+id/checkBox" android:button="@android:color/transparent" android:focusable="false" android:layout_marginLeft="15dp" android:layout_centerVertical="true" android:clickable="false" android:background="@drawable/checkbox_style"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/textView" android:layout_alignParentLeft="true" android:layout_marginLeft="50dp" android:layout_alignParentRight="true" android:layout_marginRight="100dp" android:textSize="20sp" android:gravity="center" android:text="这是测试demo"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:id="@+id/button" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:textColor="#ff0000" android:focusable="false" android:background="@drawable/button_style"/> </RelativeLayout>代码:
package com.example.myapp; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.*; public class MyActivity extends Activity { /** * Called when the activity is first created. */ private ListView listView; private ListViewAdapter adapter; private boolean flag = true; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView)findViewById(R.id.listView); adapter = new ListViewAdapter(); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox checkBox = (CheckBox)view.findViewById(R.id.checkBox); TextView textView = (TextView)view.findViewById(R.id.textView); Button button = (Button)view.findViewById(R.id.button); if(checkBox.isChecked()){ textView.setText("这是测试demo"); textView.setTextColor(getResources().getColor(R.color.white)); checkBox.setChecked(false); }else{ textView.setText("测试中。。。"); textView.setTextColor(getResources().getColor(R.color.blue)); checkBox.setChecked(true); } if(button.isFocused()){ button.setText("测试"); }else{ button.setText("Button"); } } }); } private class ListViewAdapter extends BaseAdapter{ @Override public int getCount() { return 3; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if(convertView == null){ viewHolder = new ViewHolder(); convertView = View.inflate(MyActivity.this,R.layout.item,null); viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.checkBox); viewHolder.textView = (TextView)convertView.findViewById(R.id.textView); viewHolder.button = (Button)convertView.findViewById(R.id.button); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!flag) { ((Button) v).setText("测试中。。。"); flag = true; }else{ ((Button)v).setText("Button"); flag = false; } } }); return convertView; } } private class ViewHolder{ CheckBox checkBox; TextView textView; Button button; } }