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

本文介绍如何在Android应用中实现带有图片和复选框的ListView组件,并提供详细的代码示例,包括自定义适配器及布局文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

Java代码 

  1. package com.zwq.umeng;    
  2.     
  3. import java.util.ArrayList;    
  4. import java.util.HashMap;    
  5. import java.util.List;    
  6. import java.util.Map;    
  7.     
  8. import android.content.Context;    
  9. import android.view.LayoutInflater;    
  10. import android.view.View;    
  11. import android.view.ViewGroup;    
  12. import android.widget.BaseAdapter;    
  13. import android.widget.CheckBox;    
  14. import android.widget.ImageView;    
  15. import android.widget.TextView;    
  16.     
  17. public class MyAdapter extends BaseAdapter {    
  18.     private LayoutInflater mInflater;    
  19.     private List<Map<String, Object>> mData;    
  20.     public static Map<Integer, Boolean> isSelected;    
  21.     
  22.     public MyAdapter(Context context) {    
  23.         mInflater = LayoutInflater.from(context);    
  24.         init();    
  25.     }    
  26.     
  27.     //初始化    
  28.     private void init() {    
  29.         mData=new ArrayList<Map<String, Object>>();    
  30.         for (int i = 0; i < 5; i++) {    
  31.             Map<String, Object> map = new HashMap<String, Object>();    
  32.             map.put("img", R.drawable.icon);    
  33.             map.put("title""第" + (i + 1) + "行的标题");    
  34.             mData.add(map);    
  35.         }    
  36.         //这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。    
  37.         isSelected = new HashMap<Integer, Boolean>();    
  38.         for (int i = 0; i < mData.size(); i++) {    
  39.             isSelected.put(i, false);    
  40.         }    
  41.     }    
  42.     
  43.     @Override    
  44.     public int getCount() {    
  45.         return mData.size();    
  46.     }    
  47.     
  48.     @Override    
  49.     public Object getItem(int position) {    
  50.         return null;    
  51.     }    
  52.     
  53.     @Override    
  54.     public long getItemId(int position) {    
  55.         return 0;    
  56.     }    
  57.     
  58.     @Override    
  59.     public View getView(int position, View convertView, ViewGroup parent) {    
  60.         ViewHolder holder = null;    
  61.         //convertView为null的时候初始化convertView。    
  62.         if (convertView == null) {    
  63.             holder = new ViewHolder();    
  64.             convertView = mInflater.inflate(R.layout.vlist, null);    
  65.             holder.img = (ImageView) convertView.findViewById(R.id.img);    
  66.             holder.title = (TextView) convertView.findViewById(R.id.title);    
  67.             holder.cBox = (CheckBox) convertView.findViewById(R.id.cb);    
  68.             convertView.setTag(holder);    
  69.         } else {    
  70.             holder = (ViewHolder) convertView.getTag();    
  71.         }    
  72.         holder.img.setBackgroundResource((Integer) mData.get(position).get(    
  73.                 "img"));    
  74.         holder.title.setText(mData.get(position).get("title").toString());    
  75.         holder.cBox.setChecked(isSelected.get(position));    
  76.         return convertView;    
  77.     }    
  78.     
  79.     public final class ViewHolder {    
  80.         public ImageView img;    
  81.         public TextView title;    
  82.         public CheckBox cBox;    
  83.     }    
  84. }    

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

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

Java代码 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="horizontal"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     >    
  7.     <ImageView    
  8.         android:id="@+id/img"    
  9.         android:layout_width="wrap_content"    
  10.         android:layout_height="wrap_content"    
  11.         android:layout_gravity="center_vertical"/>    
  12.     <TextView     
  13.         android:id="@+id/title"    
  14.         android:textSize="18dip"    
  15.         android:layout_weight="1"    
  16.         android:layout_width="wrap_content"    
  17.         android:layout_height="wrap_content"/>    
  18.     <CheckBox    
  19.         android:id="@+id/cb"    
  20.         android:layout_width="wrap_content"    
  21.         android:layout_height="wrap_content"    
  22.         android:focusable="false"    
  23.         android:focusableInTouchMode="false"    
  24.         android:clickable="false"           
  25.         android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>    
  26. </LinearLayout>    
  27.  

android:layout_weight="1"这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。

  1. android:focusable="false"   
  2.         android:focusableInTouchMode="false"   
  3.         android:clickable="false"   

这三句很重要,如果不加就会出现错误。

由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。

接下来在main.xml中添加Listview组件

Java代码

  1. <ListView    
  2.         android:id="@+id/lv"    
  3.         android:layout_width="fill_parent"     
  4.         android:layout_height="wrap_content"/>    

接下来就是在activity中调用:

Java代码

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

最新看一下效果图:

效果图

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

Java代码

  1. OnClickListener bPop = new OnClickListener() {    
  2.         @Override    
  3.         public void onClick(View v) {    
  4.             for(int i=0;i<list.getCount();i++){    
  5.                 if(MyAdapter.isSelected.get(i)){    
  6.                     ViewHolder vHollder = (ViewHolder) list.getChildAt(i).getTag();    
  7. Log.i(TAG, "--onClick --"+vHollder.title.getText());    
  8.                 }    
  9.             }    
  10.         }    
  11.     };   
CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者专业工程师的一款实用工具,其强大的兼容性易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程调试。
内存分区情况的分析是嵌入式系统开发中的一个重要环节,特别是在资源有限的MCU(微控制器)环境中。标题提到的工具是一款专为分析Linux环境下的`gcc-map`文件设计的工具,这类文件在编译过程结束后生成,包含了程序在目标设备内存中的布局信息。这个工具可以帮助开发者理解程序在RAM、ROM以及FLASH等存储区域的占用情况,从而进行优化。 `gcc-map`文件通常包含以下关键信息: 1. **符号表**:列出所有定义的全局静态变量、函数以及其他符号,包括它们的地址大小。 2. **节区分配**:显示每个代码数据节区在内存中的位置,比如.text(代码)、.data(已初始化数据)、.bss(未初始化数据)等。 3. **内存汇总**:总览所有节区的大小,有助于评估程序的整体内存需求。 4. **重定位信息**:显示了代码数据如何在目标地址空间中定位。 该分析工具可能提供以下功能: 1. **可视化展示**:将内存分配以图形化方式呈现,便于直观理解。 2. **详细报告**:生成详细的分析报告,列出每个符号的大小位置。 3. **比较功能**:对比不同编译版本或配置的`map`文件,查看内存使用的变化。 4. **统计分析**:计算各种内存区域的使用率,帮助识别潜在的优化点。 5. **自定义过滤**:允许用户根据需要筛选关注特定的符号或节区。 虽然在MCU环境中,Keil IDE自的工具可能更方便,因为它们通常针对特定的MCU型号进行了优化,提供更加细致的硬件相关分析。然而,对于通用的Linux系统或跨平台项目,这款基于`gcc-map`的分析工具提供了更广泛的适用性。 在实际使用过程中,开发者可以利用这款工具来: - **优化内存使用**:通过分析哪些函数或数据占用过多的内存,进行代码重构或调整链接器脚本以减小体积。 - **排查内存泄漏**:结合其他工具,比如动态内存检测工具,查找可能导致内存泄漏的部分。 - **性能调优**:了解代码执行时的内存分布,有助于提高运行效率。 - **满足资源限制**:在嵌入式系统中,确保程序能在有限的内存空间内运行。 总结来说,`gcc-amap`这样的工具对于深入理解程序的内存布局资源消耗至关重要,它能帮助开发者做出更明智的决策,优化代码以适应不同的硬件环境。在处理`map`文件时,开发者不仅能获取到程序的内存占用情况,还能进一步挖掘出可能的优化空间,从而提升系统的整体性能效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值