在listview与CheckBox连用中会遇到复用问题,即使做了优化也不能防止CheckBox错乱,所以给它一个对象封装进集合。布局太丑就不展示效果啦!
activity_main.xml布局
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
在listv.xml布局
android:descendantFocusability=”blocksDescendants”
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了。
<?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:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="iiiii"
android:textSize="25sp" />
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="150dp" />
</LinearLayout>
MainActivity类
public class MainActivity extends AppCompatActivity {
@ViewInject(R.id.listview)
private ListView listView;
private List<Bean> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
x.view().inject(this);
for (int i = 0; i < 50; i++) {
Bean bean = new Bean("item--" + i, false);
list.add(bean);
}
MyAdapter adapter = new MyAdapter();
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MyAdapter.ViewHolder holder=(MyAdapter.ViewHolder) view.getTag();
if (holder.checkBox.isChecked()){
holder.checkBox.setChecked(false);
}else{
holder.checkBox.setChecked(true);
}
}
});
}
//适配器类
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//给listview做优化
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(MainActivity.this, R.layout.listv, null);
holder = new ViewHolder();
//获取控件id
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
holder.textView = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Bean bean = list.get(position);
//给checkbox设置点击监听
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
bean.isCheck = isChecked;
}
});
holder.textView.setText(bean.name);
holder.checkBox.setChecked(bean.isCheck);
return convertView;
}
class ViewHolder {
TextView textView;
CheckBox checkBox;
}
}
}
Bean类
为了防止错乱建立对象给它属性值,boolean属性必不可少。
public class Bean {
public String name;
public boolean isCheck;
public Bean(String name, boolean isCheck) {
this.name = name;
this.isCheck = isCheck;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean check) {
isCheck = check;
}
}
App类
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG);
}
}
记得在AndroidManifest.xml里添加
android:name=".App"
记得导xutils包
compile 'org.xutils:xutils:3.5.0'