Android listView+CheckBox的实现
之前项目里面需要listView+RadioButton的实现,然后自己闲着没事就想实现以下ListView+CheckBox,说干就干动手做了以下,因为listView存在复用的功能,所以也会存在一些问题
存在问题的样例:
1、MainActivity的页面布局 activity_main.xml
<?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.hz.loginapp.MainActivity">
<ListView
android:id="@+id/lv_text_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
2、ListView的item的布局 list_view_item.xml
<?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="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_check_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2.0"
android:text="名称"
android:textColor="#ff323232"
android:textSize="16sp"
android:typeface="monospace" />
<CheckBox
android:id="@+id/rb_check_button"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:gravity="center"
android:textColor="#000000"
android:textSize="15sp" />
</LinearLayout>
3、MainActivity代码
public class MainActivity extends Activity {
//创建显示列表的listView
private ListView listView;
//列表标题list
private List<String> listText;
//创建适配器对象
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化页面对象
init();
//将数据显示在页面上
initDate();
}
public void init(){
listView=(ListView) findViewById(R.id.lv_text_view);
listText=new ArrayList<String>();
}
public void initDate(){
//模拟创建数据
for (int i=0;i<60;i++){
listText.add("复选按钮标题"+i);
}
adapter=new MyAdapter(listText,this);
listView.setAdapter(adapter);
}
}
4、listView的适配器Adapter
public class MyAdapter extends BaseAdapter {
private List<String> listText;
private Context context;
private Map<Integer,Boolean> map=new HashMap<>();
public MyAdapter(List<String> listText,Context context){
this.listText=listText;
this.context=context;
}
@Override
public int getCount() {
//return返回的是int类型,也就是页面要显示的数量。
return listText.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
if (convertView==null){
//通过一个打气筒 inflate 可以把一个布局转换成一个view对象
view=View.inflate(context,R.layout.list_view_item,null);
}else {
view=convertView;//复用历史缓存对象
}
//单选按钮的文字
TextView radioText=(TextView)view.findViewById(R.id.tv_check_text);
radioText.setText(listText.get(position));
//单选按钮
final CheckBox checkBox=(CheckBox)view.findViewById(R.id.rb_check_button);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked()){
map.put(position,true);
}else {
map.remove(position);
}
}
});
if(map!=null&&map.containsKey(position)){
checkBox.setChecked(true);
}else {
checkBox.setChecked(false);
}
return view;
}
}
修改之后的样例: