`
stephen830
  • 浏览: 3010257 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android开发:实现带图片和checkbox的listview

 
阅读更多

Android开发:实现带图片和checkbox的listview

 

转载自 http://mobile.51cto.com/android-254823.htm

 

项目要用到一个listview,要求是可以显示图片,后面还有有复选框。

先新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,我这儿由于是测试的,所以把数据写死了。

 

package com.zwq.umeng;    
    
import java.util.ArrayList;    
import java.util.HashMap;    
import java.util.List;    
import java.util.Map;    
    
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.ImageView;    
import android.widget.TextView;    
    
public class MyAdapter extends BaseAdapter {    
    private LayoutInflater mInflater;    
    private List<Map<String, Object>> mData;    
    public static Map<Integer, Boolean> isSelected;    
    
    public MyAdapter(Context context) {    
        mInflater = LayoutInflater.from(context);    
        init();    
    }    
    
    //初始化    
    private void init() {    
        mData=new ArrayList<Map<String, Object>>();    
        for (int i = 0; i < 5; i++) {    
            Map<String, Object> map = new HashMap<String, Object>();    
            map.put("img", R.drawable.icon);    
            map.put("title", "第" + (i + 1) + "行的标题");    
            mData.add(map);    
        }    
        //这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。    
        isSelected = new HashMap<Integer, Boolean>();    
        for (int i = 0; i < mData.size(); i++) {    
            isSelected.put(i, false);    
        }    
    }    
    
    @Override    
    public int getCount() {    
        return mData.size();    
    }    
    
    @Override    
    public Object getItem(int position) {    
        return null;    
    }    
    
    @Override    
    public long getItemId(int position) {    
        return 0;    
    }    
    
    @Override    
    public View getView(int position, View convertView, ViewGroup parent) {    
        ViewHolder holder = null;    
        //convertView为null的时候初始化convertView。    
        if (convertView == null) {    
            holder = new ViewHolder();    
            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));    
        return convertView;    
    }    
    
    public final class ViewHolder {    
        public ImageView img;    
        public TextView title;    
        public CheckBox cBox;    
    }    
}  

 

上面类中要注意getView()方法中对数据的处理。

接下要新建一个list.xml文件,这个就是布局image、textview、checkbox。

 

<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns: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组件

 

<ListView    
        android:id="@+id/lv"    
        android:layout_width="fill_parent"     
        android:layout_height="wrap_content"/>  

 

    list=(ListView)findViewById(R.id.lv);    
            MyAdapter adapter=new MyAdapter(this);    
            list.setAdapter(adapter);    
            list.setItemsCanFocus(false);    
            list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);    
        
            list.setOnItemClickListener(new OnItemClickListener(){    
                @Override    
                public void onItemClick(AdapterView<?> parent, View view,    
                        int position, long id) {    
                    ViewHolder vHollder = (ViewHolder) view.getTag();    
    //在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。    
                    vHollder.cBox.toggle();    
                    MyAdapter.isSelected.put(position, vHollder.cBox.isChecked());    
                }    
            });  

 

最后看一下效果图:


 

要获取哪些项目被选择了,可以这样测试:

    OnClickListener bPop = new OnClickListener() {    
            @Override    
            public void onClick(View v) {    
                for(int i=0;i<list.getCount();i++){    
                    if(MyAdapter.isSelected.get(i)){    
                        ViewHolder vHollder = (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将与您一起分享!

 

 

 

 

 

  • 大小: 44.3 KB
分享到:
评论

相关推荐

    CheckBoxListView

    总的来说,CheckBoxListView是Android开发中一个实用的组件,它通过优化选择逻辑和处理图片错位问题,提升了用户在列表中的选择体验。理解和掌握这种实现方式对于提升Android应用的用户体验和开发技能非常有帮助。

    android ListView+CheckBox实现单选

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。当需要在列表项中添加选择功能时,我们通常会结合使用ListView与CheckBox。本篇将详细讲解如何利用这两种组件实现ListView中的单选功能。 ...

    android listview+checkbox实现多选

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。在许多场景下,我们需要在ListView中加入复选框(Checkbox),实现多选功能,例如用户可以选择多个项目进行操作。本文将详细介绍如何在Android中...

    Android里ListView里面添加CheckBox实现多选

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。在某些场景下,我们可能需要在ListView的每个项中添加一个复选框(CheckBox),以便用户可以选择多个条目。这个功能在各种应用中非常常见,...

    android listview 里面使用checkbox

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。当需要在ListView的每一项中加入复选框(Checkbox)时,这通常涉及到自定义Adapter和处理复选状态的逻辑。以下是对这个主题的详细阐述:...

    ListVIew 实现Checkbox多选

    在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。当用户需要在列表项中进行多选操作时,通常会结合Checkbox来实现。本文将深入探讨如何在ListView中实现Checkbox多选功能,以及相关的Android编程...

    android listview和checkbox联合使用选中和取消

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。而CheckBox则是一种复选框组件,常用于让用户进行多选操作。当ListView与CheckBox结合使用时,可以实现用户在列表中选择多个项目的功能。本文将...

    Android完美解决ListView复用导致的Checkbox状态混乱问题

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,ListView的复用机制有时会导致一些问题,特别是在涉及复选框(Checkbox)的状态管理时。本篇文章将详细探讨这个问题,并提供一个完美的...

    Android ListView 带 CheckBox(全选,反选,全不选)

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要在ListView的每个项中添加CheckBox,以便用户可以进行多选操作,如选择联系人、选择任务等。本篇文章将深入讲解...

    listview中添加CheckBox的完美实现

    在我们的示例代码中,我们实现了一个完美的 ListView 中添加 CheckBox 的解决方案,它可以解决事件冲突和复用错误的问题。我们使用了一个自定义的 Adapter 来控制 ListView 中的每个项目,并使用了一个 HashMap 来...

    Android ListView+checkbox 实现批量删除

    在Android开发中,ListView是常用的数据展示控件,它可以高效地显示大量数据并支持滚动操作。在实际应用中,我们经常需要实现一个功能,让用户能够选择ListView中的多个条目进行批量删除,这正是"Android ListView+...

    android之listview和checkbox

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。它的高效性和可滚动性使得它在各种场景下都能发挥重要作用。本教程将深入探讨如何在ListView中集成CheckBox,以便用户可以选择列表中的多项...

    Android 带CheckBox的ListView 实现多选,全选,反选,删除效果

    ### Android ListView 中实现多选、全选、反选与...通过上述步骤,我们可以实现在`Android`应用中带有`CheckBox`的`ListView`,并支持全选、反选和删除等功能。这不仅增强了应用程序的功能性,还提高了用户的使用体验。

    Android ListView CheckBox

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。CheckBox则是用来实现复选功能,常常与ListView结合,以实现用户对列表项的多选操作。本篇文章将详细探讨如何在Android中实现一个具有多选、...

    ListView CheckBox

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。CheckBox则是提供多选功能的组件。当这两者结合时,可以实现用户在ListView中进行多项选择,例如全选、取消选中以及删除操作。以下是关于...

    完美解决ListView和CheckBox的焦点冲突及CheckBox的复用问题

    在Android开发中,ListView是常用的数据展示组件,它允许用户滚动查看大量的数据项。然而,当ListView中的元素包含可交互的控件,如CheckBox时,会遇到一些常见问题,如焦点冲突和视图复用导致的显示异常。本文将...

    android UI进阶之实现listview中checkbox的多选与记录

    本篇文章将深入探讨如何在ListView中实现CheckBox的多选功能,并记录用户的选定状态。ListView是Android中常用的一个控件,它允许我们以列表的形式展示大量数据,而CheckBox则提供了一种让用户进行多选操作的方式。 ...

    Android 的listView 带checkbox实现多选,全选,反选

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。当需要在ListView中添加复选框(CheckBox)来实现多选、全选和反选功能时,需要处理多个技术点。以下是对这个主题的详细解释: 1. **...

    带CheckBox的listView 支持多选,全选,反选

    总之,“带CheckBox的listView”项目涵盖了Android开发中常见的交互需求,通过解决已知的bug,提供了一个稳定且功能完善的实现。对于开发者来说,这是一个很好的学习和参考资源,可以帮助快速构建具备多选功能的列表...

Global site tag (gtag.js) - Google Analytics