您的位置:首页 > 移动开发 > Android开发

android中ListView添加CheckBox控件实现选择

2015-04-27 14:46 776 查看
android中ListView添加CheckBox控件,类似购物车功能经常需要这种功能,全选,取消已选等等,下面这个程序是参考网上另一篇博客写出来的。该程序实现功能,全选,反选,取消已选,点击每一行选择。

效果图如下:



首先完成布局文件:

<LinearLayout 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"
android:orientation="vertical">

<TextView
android:id="@+id/tvselected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已选择了:" />

<ListView
android:id="@+id/lv"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal"
>
<Button
android:id="@+id/btn_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"
/>
<Button
android:id="@+id/btn_fan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="反选"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_cancle"
android:text="取消已选"
/>
</LinearLayout>

</LinearLayout>


一个TextView控件,要来识别选择了几项,中间是一个listview控件,最后一个水平布局实现三个按钮。该处有个地方值得学习,设置ListView控件高度为0dp,android:layout_weight="1",可以实现下面按钮不动,永远在屏幕的下方。

给出ListView控件每一行的布局:

<?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="match_parent">

<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
/>

<CheckBox
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
/>
</RelativeLayout>


每一行实现一个TextView控件和一个CheckBox控件。

下面给出功能主代码:

package com.example.checkbox;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.example.checkbox.CheckBoxAdapter.ViewCache;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{

private TextView tvSelected;
private Button btnAll;
private Button btnFan;
private Button btnCancle;
private ListView lv;
private List<HashMap<String,Object>> list;
private CheckBoxAdapter cbAdapter;
private List<String> listStr = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

InitViews();
}

private void InitViews() {
tvSelected = (TextView) findViewById(R.id.tvselected);
btnAll = (Button) findViewById(R.id.btn_all);
btnFan = (Button) findViewById(R.id.btn_fan);
btnCancle = (Button) findViewById(R.id.btn_cancle);
lv = (ListView) findViewById(R.id.lv);

list = new ArrayList<HashMap<String,Object>>();
for(int i=0;i<10;i++){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", "G"+i);
map.put("boolean", false);//初始化为未选
list.add(map);
}//初始化数据

cbAdapter = new CheckBoxAdapter(this,list);
lv.setAdapter(cbAdapter);

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
ViewCache viewCache = (ViewCache) view.getTag();
viewCache.cb.toggle();
list.get(position).put("boolean", viewCache.cb.isChecked());

cbAdapter.notifyDataSetChanged();

if(viewCache.cb.isChecked()){//被选中状态
listStr.add(list.get(position).get("name").toString());
}else//从选中状态转化为未选中
{
listStr.remove(list.get(position).get("name").toString());
}

tvSelected.setText("已选择了:"+listStr.size()+"项");
}
});

btnAll.setOnClickListener(this);
btnCancle.setOnClickListener(this);
btnFan.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_all://全选,修改值为true
for(int i=0;i<list.size() && !(Boolean)list.get(i).get("boolean") ;i++){
list.get(i).put("boolean", true);
listStr.add(list.get(i).get("name").toString());
}
cbAdapter.notifyDataSetChanged();

tvSelected.setText("已选择了:"+listStr.size()+"项");
break;
case R.id.btn_fan:
for(int i=0;i<list.size();i++){
if((Boolean)list.get(i).get("boolean")){//为true
list.get(i).put("boolean", false);
listStr.remove(list.get(i).get("name").toString());
}
else
{
list.get(i).put("boolean", true);
listStr.add(list.get(i).get("name").toString());
}
}
cbAdapter.notifyDataSetChanged();

tvSelected.setText("已选择了:"+listStr.size()+"项");
break;
case R.id.btn_cancle://取消已选
for(int i=0;i<list.size();i++){
if((Boolean)list.get(i).get("boolean")){
list.get(i).put("boolean", false);
listStr.remove(list.get(i).get("name").toString());
}
}
cbAdapter.notifyDataSetChanged();

tvSelected.setText("已选择了:"+listStr.size()+"项");
break;
}
}
}


在每次list中的数据发生改变时,需要附上:

cbAdapter.notifyDataSetChanged();


这样才能够重新刷新UI界面。

ListView添加适配器类:

package com.example.checkbox;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;

public class CheckBoxAdapter extends BaseAdapter{

private Context context;
private List<HashMap<String,Object>> list;
private LayoutInflater layoutInflater;
private TextView tv;
private CheckBox cb;
public CheckBoxAdapter(Context context,List<HashMap<String, Object>> list) {
this.context = context;
this.list = list;//list中checkbox状态为false
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@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;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = layoutInflater.inflate(R.layout.listview_item, null);

ViewCache viewCache = new ViewCache();
tv = (TextView) convertView.findViewById(R.id.item_tv);
cb = (CheckBox) convertView.findViewById(R.id.cb);

viewCache.tv = tv;
viewCache.cb = cb;
convertView.setTag(viewCache);
}else
{
ViewCache viewCache = (ViewCache) convertView.getTag();
tv = viewCache.tv;
cb = viewCache.cb;
}

tv.setText(list.get(position).get("name")+"");
cb.setChecked((Boolean) list.get(position).get("boolean"));
return convertView;
}

public class ViewCache{
TextView tv;
CheckBox cb;
}
}


注:参考博客http://yangshen998.iteye.com/blog/1310183

代码另外就不给了,已经全部粘上去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐