公司的项目中商品添加购物车用到了ListView中带多选框实现多选,并且点击item可以查看到该商品的详细信息,现把自己实现过程中遇到的问题及解决思路分享出来,供大家参考,本篇为小生的第一篇博客,主要是为了记录自己的成长,希望大家支持,指教。源码下载地址:http://download.youkuaiyun.com/detail/qq_28517673/9454788
首先,布局文件:布局文件需要注意的是listview中的item中的如果包含Button,checkBox,RadioButton等控件,会导致点击事件的冲突,这是由于android事件分发机制导致的,此时只需要为子控件添加android:focusable="false"属性,就可解决点击事件冲突。
<?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:orientation="vertical"
android:padding="4dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:ellipsize="end"
android:maxLines="2"
android:text=""
android:textColor="#383838"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="#E66230"
android:textSize="16sp" />
<CheckBox
android:id="@+id/cb_check"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginRight="5dp"
android:background="@drawable/checkbox_check_bg"
android:button="@null"
android:focusable="false" />
</LinearLayout>
</LinearLayout>
蓝色字体部分,为自定义的checkBox背景样式(默认的样式难以满足需求),此时必须设置android:button="@null",
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/icon_check_true" android:state_checked="true"></item>
<item android:drawable="@drawable/icon_check_true" android:state_selected="true"></item>
<item android:drawable="@drawable/icon_check_true" android:state_pressed="true"></item>
<item android:drawable="@drawable/icon_check_false"></item>
</selector>
背景图可以根据项目需求截图替换到此,布局文件已经写完。
然后,我们现在创建一个商品类Goods,属性有名字,价格和是否选中(isCheck属性是关键),
public class Goods {
public String id;//商品的唯一标识public String name;
public int price;
public boolean isCheck;//是否选中
}
下面是Activity代码,非常简单,这里不多说
public class MainActivity extends Activity {
private ListView lv;
private ListViewAda adapter;
private List<Goods> lists = new ArrayList<Goods>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
for (int i = 0; i < 20; i++) {
Goods goods = new Goods();
goods.id = "" + i + 1;
goods.name = "张三" + i;
goods.price = 100 + i;
goods.isCheck = false;// 这里默认都为未选中状态
lists.add(goods);
}
adapter.notifyDataSetChanged();
}
private void initView() {
lv = (ListView) findViewById(R.id.listView1);
adapter = new ListViewAda(lists, MainActivity.this);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, position + "被点击了",
Toast.LENGTH_LONG).show();
}
});
}
}
最后,到了最关键部分,Adapter类,先贴代码;
public class ListViewAda extends BaseAdapter {
private List<Goods> lists = new ArrayList<Goods>();
private LayoutInflater inflater;
private Context context;
private List<Goods> shopCart = new ArrayList<Goods>();//购物车列表
public ListViewAda(List<Goods> lists, Context context) {
super();
this.lists = lists;
this.context = context;
this.inflater = inflater.from(context);
}
@Override
public int getCount() {
if (lists.size() > 0)
return lists.size();
return 0;
}
@Override
public Object getItem(int position) {
return lists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
if (convertView == null) {
vh = new ViewHolder();
convertView = inflater.inflate(R.layout.ada_layput, null);
vh.tvName = (TextView) convertView.findViewById(R.id.textView1);
vh.tvPrice = (TextView) convertView.findViewById(R.id.textView2);
vh.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
vh.tvName.setText(lists.get(position).name);
vh.tvPrice.setText(Integer.toString(lists.get(position).price)
.toString());
String id = lists.get(position).id;
if (shopCart.size() > 0) {
for (int i = 0; i < shopCart.size(); i++) {
if (id.equals(shopCart.get(i).id)) {
lists.get(position).isCheck = true;
}
}
}
vh.cb.setChecked(lists.get(position).isCheck);
vh.cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String id = lists.get(position).id;
Boolean check = lists.get(position).isCheck;
if (check == true) {// 表示已经选中
lists.get(position).isCheck = false;
for (int i = 0; i < shopCart.size(); i++) {
if (id.equals(shopCart.get(i).id)) {
shopCart.remove(i);
}
}
} else {
lists.get(position).isCheck = true;
// 避免重复先移除再添加
for (int i = 0; i < shopCart.size(); i++) {
if (id.equals(shopCart.get(i).id)) {
shopCart.remove(i);
}
}
shopCart.add(lists.get(position));
}
Toast.makeText(context, "您的购物车中现有" + shopCart.size() + "件商品",
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
class ViewHolder {
TextView tvName, tvPrice;
CheckBox cb;
}
这里必须用checkBox的setOnclickListener监听,不能用setOnCheckedChangeListener监听,用setOnCheckedChangeListener
监听,adapter复用View时,会导致checkBox的点击状态显示错乱。