热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

实例讲解Androidapp开发中ListView的基本使用及优化

这篇文章主要介绍了Androidapp开发中ListView的基本使用及优化,ListView视图组件是Android中最常用的组件之一需要的朋友可以参考下

一、直接使用ListView组件创建
1.直接在XML中创建ListView用entries属性附上一个数组资源
其中divider属性是设置分割线可以使用颜色和drawable资源分割

 
  

在values下定义一个数组资源文件arrays.xml


情景模式1
情景模式2 
情景模式3

2.创建ArrayAdapter指定要显示的列表项
在oncreat方法中关联适配器

simple_list_item_1:列表项为普通文本

simple_list_item_2:列表项为普通文本字体略大
simple_list_item_checked:列表项为一个已选中的
simple_list_item_multiple_choice:带有复选框的列表项
simple_list_item_single_choice:带有单选按钮的列表项

listview = (ListView) findViewById(R.id.listView1);
 ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.ctype, android.R.layout.simple_list_item_checked);
    listview.setAdapter(adapter);

二、让Activity继承ListActivity实现

public class ActivityMain extends ListActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    String[] ctype ={"1","2","3"}; 
    ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,ctype);
    setListAdapter(adapter);

  }

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position, id);
  }


}

三、SimpleAdapter和BaseAapter的使用(重点)
SimpleAdapter的使用

在main.xml中添加ListView组件
编写用于布局列表项内容的布局文件items.xml
创建一个简单适配器与ListView关联

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
    

public class MainActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ListView listview = (ListView) findViewById(R.id.listView1); // 获取列表视图
    int[] imageId = new int[] { R.drawable.img01, R.drawable.img02,
        R.drawable.img03, R.drawable.img04, R.drawable.img05,
        R.drawable.img06, R.drawable.img07, R.drawable.img08 }; // 定义并初始化保存图片id的数组
    String[] title = new String[] { "保密设置", "安全", "系统设置", "上网", "我的文档",
        "GPS导航", "我的音乐", "E-mail" }; // 定义并初始化保存列表项文字的数组
    List> listItems = new ArrayList>(); // 创建一个list集合
    // 通过for循环将图片id和列表项文字放到Map中,并添加到list集合中
    for (int i = 0; i  map = new HashMap(); // 实例化Map对象
      map.put("image", imageId[i]);
      map.put("title", title[i]);
      listItems.add(map); // 将map对象添加到List集合中
    }

    SimpleAdapter adapter = new SimpleAdapter(this, listItems,
        R.layout.items, new String[] { "title", "image" }, new int[] {
            R.id.title, R.id.image }); // 创建SimpleAdapter
    listview.setAdapter(adapter); // 将适配器与ListView关联

  }
}

三、BaseAdapter的使用及ListView的优化
使用方法同上主要是BaseAdapter的使用更加灵活也更加强大,可以向其中添加其他控件。

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

  

  




public class MainActivity extends Activity {
  private ListView lv;
  private List infos;
  private Random random;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv = (ListView) findViewById(R.id.listView1);
    infos = new ArrayList();
//通过for循环将name和number添加到List集合中
    for (int i = 0; i <100; i++) {
      MyInfo userInfo = new MyInfo();
      userInfo.setName("name"+i);
      userInfo.setNumber("number"+i);
      infos.add(userInfo);
      System.out.println(userInfo.toString());  
    }

    lv.setAdapter(new MyAdapter());
  }

  private class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() {
      return infos.size();//返回listview的长度
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      MyInfo userInfo = infos.get(position);
      View view;
      ViewHolder holder;
      //减少内存中view对象创建的次数
      if (convertView != null && convertView instanceof RelativeLayout) {
        view = convertView;//复用已经回收掉的view对象
        holder = (ViewHolder) view.getTag();//得到他们的引用
      } else {
        view = View.inflate(getApplicationContext(),
            R.layout.item_layout, null);//把布局文件转化成View对象
        holder = new ViewHolder();
        //把ID存到存到holder对象中
        //注意是在view下findViewById
        holder.iv = (ImageView) view.findViewById(R.id.imageView1);
        holder.tv1 = (TextView) view.findViewById(R.id.textView1);
        holder.tv2 = (TextView) view.findViewById(R.id.textView2);
        view.setTag(holder);//对象创建出来时找到他们的引用存到holder中
      }
      holder.tv1.setText(infos.get(position).getName());
      holder.tv2.setText(infos.get(position).getNumber());
      return view;
    }
    @Override
    public Object getItem(int position) {      
      return null;
    }

    @Override
    public long getItemId(int position) {      
      return 0;
    }    

  }
  /*
   * view对象的容器记录View对象的内存地址相当于一个记事本
   */
  static class ViewHolder{
    TextView tv1;
    TextView tv2;
    ImageView iv;
  }

}
public class MyInfo {
  private String name; 
  private String number;//也可以添加Bitmap

  @Override
  public String toString() {
    return "MyInfo [name=" + name + ", number=" + number + "]";
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getNumber() {
    return number;
  }
  public void setNumber(String number) {
    this.number = number;
  }


}

注意:(很多人不注意下面的这条语句是在view下findViewById,少了view会造成空指针异常)

holder.iv = (ImageView) view.findViewById(R.id.imageView1);

优化的原理就是动态循环复用已经回收掉的ListView对象(回收后为convertview),保持一个界面下的ListView的条目数的动态平衡。(具体内容参考代码注释即可)


推荐阅读
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 如何在系统设置中找到高级配置选项 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • 您是否了解:火狐浏览器会收集用户数据?
    您是否知道:火狐浏览器会收集用户数据?尽管Firefox浏览器的地理位置服务在浏览器关闭后仍会在后台运行,这引发了对用户隐私的担忧。最近,关于浏览器插件的争议进一步加剧了这种不安,因为这些插件原本旨在保护隐私,却反而泄露了用户信息。 ... [详细]
  • 汽车电子架构与CAN网络基础解析——鉴源实验室专业解读 ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
author-avatar
暮迟_MCz_P
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有