笔者的最近在做一个一个Android项目,在项目中要用到一个listview,要求是可以显示图片,后面还有有复选框。本文将详细介绍“如何实现带图片和checkbox的listview”。
项目要用到一个listview,要求是能够显现图片,后边还有有复选框。
先新建一个MyAdapter类,承继自BaseAdapter。在MyAdapter中完成对数据的绑定,我这儿由所以测验的,所以把数据写死了。
Java代码
- packagecom.zwq.umeng;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.content.Context;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.CheckBox;
- importandroid.widget.ImageView;
- importandroid.widget.TextView;
- publicclassMyAdapterextendsBaseAdapter{
- privateLayoutInflatermInflater;
- privateList<Map<String,Object>>mData;
- publicstaticMap<Integer,Boolean>isSelected;
- publicMyAdapter(Contextcontext){
- mInflater=LayoutInflater.from(context);
- init();
- }
- //初始化
- privatevoidinit(){
- mData=newArrayList<Map<String,Object>>();
- for(inti=0;i<5;i++){
- Map<String,Object>map=newHashMap<String,Object>();
- map.put("img",R.drawable.icon);
- map.put("title","第"+(i+1)+"行的标题");
- mData.add(map);
- }
- //这儿界说isSelected这个map是记载每个listitem的状况,初始状况悉数为false。
- isSelected=newHashMap<Integer,Boolean>();
- for(inti=0;i<mData.size();i++){
- isSelected.put(i,false);
- }
- }
- @Override
- publicintgetCount(){
- returnmData.size();
- }
- @Override
- publicObjectgetItem(intposition){
- returnnull;
- }
- @Override
- publiclonggetItemId(intposition){
- return0;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder=null;
- //convertView为null的时分初始化convertView。
- if(convertView==null){
- holder=newViewHolder();
- convertView=mInflater.inflate(R.layout.vlist,null);
- holder.img=(ImageView)convertView.findViewById(R.id.img);
- holder.title=(TextView)convertView.findViewById(R.id.title);
- holder.cBox=(CheckBox)convertView.findViewById(R.id.cb);
- convertView.setTag(holder);
- }else{
- holder=(ViewHolder)convertView.getTag();
- }
- holder.img.setBackgroundResource((Integer)mData.get(position).get(
- "img"));
- holder.title.setText(mData.get(position).get("title").toString());
- holder.cBox.setChecked(isSelected.get(position));
- returnconvertView;
- }
- publicfinalclassViewHolder{
- publicImageViewimg;
- publicTextViewtitle;
- publicCheckBoxcBox;
- }
- }
上面类中要注意getView()办法中对数据的处理。
接下要新建一个list.xml文件,这个便是布局image、textview、checkbox。
Java代码
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <ImageView
- android:id="@+id/img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"/>
- <TextView
- android:id="@+id/title"
- android:textSize="18dip"
- android:layout_weight="1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <CheckBox
- android:id="@+id/cb"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:clickable="false"
- android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
- </LinearLayout>
Android:layout_weight="1"这一句能够使中心的textview权重增大,然后后边的checkbok能够居右显现。
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:clickable="false"
这三句很重要,假如不加就会呈现过错。
因为checkbox的点击事情优先级比listview的高,所以要在checkbox中增加android:focusable="false",使得checkbox初始的时分没有获取焦点。
接下来在main.xml中增加Listview组件
Java代码
- <ListView
- android:id="@+id/lv"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
接下来便是在activity中调用:
Java代码
- list=(ListView)findViewById(R.id.lv);
- MyAdapteradapter=newMyAdapter(this);
- list.setAdapter(adapter);
- list.setItemsCanFocus(false);
- list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- list.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,
- intposition,longid){
- ViewHoldervHollder=(ViewHolder)view.getTag();
- //在每次获取点击的item时将关于的checkbox状况改动,一同修正map的值。
- vHollder.cBox.toggle();
- MyAdapter.isSelected.put(position,vHollder.cBox.isChecked());
- }
- });
***看一下效果图:
要获取哪些项目被挑选了,能够这样测验:
Java代码
- OnClickListenerbPop=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- for(inti=0;i<list.getCount();i++){
- if(MyAdapter.isSelected.get(i)){
- ViewHoldervHollder=(ViewHolder)list.getChildAt(i).getTag();
- Log.i(TAG,"--onClick--"+vHollder.title.getText());
- }
- }
- }
- };
总结:
1、数据能够在Activity中获取,在初始化Adapter的时分作为参数传递曩昔,这样就能够是list编程动态的。
2、对MyAdapter中getview的了解不行,尤其是convertView.setTag(holder),假如您对getview有什么新的运用心得能够发Email:zhousn@51cto.com,51CTO将与您一同共享!
【修改引荐】
- Android 诉苦它仍是拥抱它?
- Android触屏textview及listview比照验证
- Android ListView杂乱运用方法简略了解