安卓ListView的使用_android listview使用-程序员宅基地

技术标签: java  android  开发语言  

1.简单介绍ListView

      listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。

      getView方法详情

   View getView (int position, View convertView, ViewGroup parent)
       Get a View that displays the data at the specified position in the data set. 
       You can either create a View manually or inflate it from an XML layout file. 
       When the View is inflated, the parent View (GridView, ListView...) will apply 
       default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to 
       specify a root view and to prevent attachment to the root
备注:使用适配器构建布局。
 
   如果布局的内容是属于动态或未预先确定的内容,您可以使用这样一种布局:在运行时通过子类 AdapterView 用视图填充布局。 AdapterView 类的子类使用 Adapter 将数据与其布局绑定。

Adapter 充当数据源与 AdapterView 布局之间的中间人—Adapter(从数组或数据库查询等来源)检索数据,并将每个条目转换为可以添加到 AdapterView 布局中的视图。

          适配器支持的常见布局包括:

           

    使用数据填充适配器视图       

    您可以通过将 AdapterView 实例与 Adapter 绑定来填充 AdapterView(如 ListView 或 GridView),此操作会从外部来源检索数据,并创建表示每个数据条目的 View

Android 提供了几个 Adapter 子类,用于检索不同种类的数据和构建 AdapterView 的视图。 两种最常见的适配器是:ArrayAdapter和SimpleCursorAdapter。

             

2.ListView使用步骤

     1).在布局的XML文件中,添加如下代码:

           

<ListView
      android:id="@+id/list_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

   

     2)新建list_item的布局文件,确定每一个View的样式。

                

  3).新建一个适配器类。

     4).绑定数据到视图。

3.使用实例

     1).使用ArrayAdapter

           主layout文件:

mylistview.xml文件


<?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="match_parent"
    >
    <ListView 
        android:id="@+id/mylistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </ListView>
</LinearLayout>

          list_item的xml文件:

list_item.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="18sp"
      >
</TextView>

         activity文件:

        

MyActivity.java文件


public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      String[] str = {"上海","北京","天津","江苏","河南","西藏","新疆","湖南","湖北"};
      List<String> listdata = new ArrayList<String>();
      listdata.add("上海");
      listdata.add("北京");
      listdata.add("天津");
      listdata.add("江苏");
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item,listdata);//listdata和str均可
      listview.setAdapter(arrayAdapter);
    }
    
    
}

       2.使用SimpleAdapter

         构造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

         simpleAdapter可以通过hashmap的方式,每个view可以显示几种不同的内容。

        1).主layout文件和上面相同

        2).list_item的布局文件

             

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
 <ImageView 
     android:id="@+id/iv1"
     android:layout_width="30dp"
     android:layout_height="30dp"
     android:src="@drawable/ic_launcher"    
     />
<TextView 
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="wgj"
        android:layout_toRightOf="@id/iv1"
      >
</TextView>
<TextView
     android:id="@+id/tv2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="18sp"
     android:text="19岁"
     android:layout_below="@id/tv1"
     android:layout_toRightOf="@id/iv1"
    >
</TextView>
</RelativeLayout>

      3.activity文件

         

public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      SimpleAdapter simpleAdapter = new SimpleAdapter(this,putData(),R.layout.list_item,
              new String[]{"name","age","pic"},new int[]{R.id.tv1,R.id.tv2,R.id.iv1});
      listview.setAdapter(simpleAdapter);
    }
    
    public List<Map<String,Object>> putData(){
        
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }  
}

   3.使用BaseAdapter

        优化方法 convertView 重用对象

          3.1.通过缓存convertView实现 
              - 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

          3.2.通过convertView+ViewHolder来实现 
                -ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。 
                -代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

         

         3.3Adapter文件

public class MyAdapter extends BaseAdapter{

    private LayoutInflater mInflater;
    private List<Map<String,Object>> list;
    
    
    public MyAdapter(Context context , List<Map<String,Object>> list){
        
        this.mInflater = LayoutInflater.from(context);
        this.list = list;
    }
    
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        
        ViewHolder holder = null;
        
        if (convertView == null) {
          
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder.name = (TextView)convertView.findViewById(R.id.tv1);
            holder.age = (TextView)convertView.findViewById(R.id.tv2);
            holder.pic = (ImageView)convertView.findViewById(R.id.iv1);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }
        
        holder.name.setText((String)list.get(position).get("name"));
        holder.age.setText((String)list.get(position).get("age"));
        holder.pic.setBackgroundResource((Integer)list.get(position).get("pic"));
        
        return convertView;
    }
    
    
    public final class ViewHolder{
        
        public TextView name;
        public TextView age;
        public ImageView pic;
    }

}

    3.4  Activity文件

        

public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      MyAdapter myAdapter = new MyAdapter(this,putData());
      listview.setAdapter(myAdapter);
    }
    
    public List<Map<String,Object>> putData(){
        
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }  
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/apple_51426592/article/details/127148828

智能推荐

mysql5.5.50安装图解_mysql5.5的安装步骤-程序员宅基地

文章浏览阅读135次。好久没有安装mysql了,今天装了下,还有点不流畅,把详细的安装的流程写下来~,后续把mysql日常操作都写成checklist1.创建mysql组和mysql用户groupadd mysqluseradd -g mysql mysql2.创建相关的目录(根据自己的规则设置目录)mkdir/data/dbdata/usr/local/mysql/usr/local/mysql/tmp或者(推荐使用..._mysql5.5.50安装

简单的微博发布程序_请设计并实现一个简易的微博系统,让用户可以发送推文-程序员宅基地

文章浏览阅读625次。能实现简单的上传和删除,以及显示发布的时间。主要是先创建个文本节点,然后将所要发布的信息追加在文本节点上。代码实现<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"&g..._请设计并实现一个简易的微博系统,让用户可以发送推文

futureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is-程序员宅基地

文章浏览阅读1k次。完整报错:FutureWarning: Conversion of the second argument of issubdtype from float to np.floating is deprecated. In future, it will be treated as np.float64 == np.dtype(float).type. from ._conv impo..._conversion of the second argument of issubdtype from int to np

abap创建或更新成本中心时如何写入附加自定义字段_bapi_billingdoc_createmultiple 添加附加字段-程序员宅基地

文章浏览阅读1k次。1、创建成本中心bapi:    BAPI_COSTCENTER_CREATEMULTIPLE2、更新成本中心bapi:    BAPI_COSTCENTER_CHANGEMULTIPLE大家在创建或更新成本中心时,有时需要写入自定义的附加字段,例如:但是bapi里costcenterlist参数是没有对应字段的,所以需要在bapi的extensionin参数里添加附加字段即可,此时如果还是没有添加成功,那需要在se18增强K_CCA_CUSTOMER_FIELD里给附加字段赋值。通过SE18_bapi_billingdoc_createmultiple 添加附加字段

python之嵌套函数调用_python函数嵌套调用-程序员宅基地

文章浏览阅读619次。#定义嵌套函数def func1(): print('this is func1') def func2(): print('this is func2')#调用1func1()输出:this is func1上面没有输出this is func2,说明嵌套子函数func2()没有被调用原因:一个函数定义后,除非通过函数名调用,要不然始终不会被调..._python函数嵌套调用

毕业设计题目计算机200例_arp毕业设计-程序员宅基地

文章浏览阅读1.1k次,点赞18次,收藏17次。24、论计算机信息及计算机信息交易——美国《统一计算机信息交易法》与美国《统一商法典》相关概念和规则的比较。5、基于条目反应理论、计算机自适应测试及数据模拟的胃痞患者报告结局量表简短版的研制与评价。14、课程思政理念下高校计算机基础课程改革与实践——以“大学计算机”课程为例。34、基于分层目标的网络课程的设计与实现——以“大学计算机基础”网络课程为例。49、基于翻转课堂的项目教学模式研究与实践——以“计算机图文设计”课程为例。20、计算机断层显像与单光子发射型计算机断层肺灌注显像配准方法的研究。_arp毕业设计

随便推点

aardio(GBK汉字转UTF8汉字)获取的字符串代码乱码的解决方法-程序员宅基地

文章浏览阅读94次。aardio(GBK汉字转UTF8汉字)获取的字符串代码乱码的解决方法

基于 Matlab 的通信系统仿真――数字通信大作业_电子通信系统课程大作业-程序员宅基地

文章浏览阅读9.2k次,点赞7次,收藏144次。基于 Matlab 的通信系统仿真――数字通信大作业附:MATLAB的通信系统仿真.rar资源包括:main.m,modulation.m,demodulation.m,MATLAB的通信系统仿真说明文档https://download.csdn.net/download/alongiii/14945669目录基于 Matlab 的通信系统仿真――数字通信大作业系统综述结构框图系统实现随机信号的生成星座图映射插值波形成形(平方根升余弦滤波器)10 倍载波调制加入高斯白噪声匹配滤波器采样判决解调误码率_电子通信系统课程大作业

OnTriggerEnter与OnCollisionEnter详解_ontriggerenter和oncollision-程序员宅基地

文章浏览阅读2.2k次。1,测试OnTriggerEnter和OnCollisionEnter的区别测试:如果两个物体A,B两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)A,B都有刚体(Rigidbody)A或者B中有一个勾选isTrigger或者两者都勾选isTriggerA和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。A和B都不勾选isTrigger,A和B能进入OnCollis_ontriggerenter和oncollision

Docker Machine快速安装Docker环境(二)_setting docker configuratin on the remote-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏7次。什么是Docker Machine?Machine是一个简化安装Docker环境的工具。怎么简化法,例如,在ubuntu安装一个docker环境要按照U这个系统配置教程来装,哪天又换了CentOS系统,又要按照这个系统配置教程装。市场上主流Linux系统版本很多,每次安装岂不有些麻烦。使用Machine工具就简单很多,一两条命令即可在主流Linux系统上安装Docker环境,用户不用考虑什么操_setting docker configuratin on the remote

基于matlab的voronoi图绘制_matlab的mpt怎么使用-程序员宅基地

文章浏览阅读2.7w次,点赞24次,收藏151次。voronoi多边形的图常常应用在各种建模中,matlab中的mpt工具箱可高效快捷绘制voronoi图,方法如下:1.安装mpt工具箱下载mpt工具箱:https://pan.baidu.com/s/1o_QsatrZsG-mj6d7uyThNw(提取码:zi1n),内有两个版本,建议安装命名为mpt的安装包。安装步骤:把安装包下载解压在你的matlab安装路径的toolbox文件夹,然..._matlab的mpt怎么使用

docker版本包 乌班图_Ubuntu安装Docker社区版-程序员宅基地

文章浏览阅读233次。Docker社区版叫Docker -ce如果安装有老的docker先删除老的版本sudo apt-getremove docker docker-engine docker.io先更新包信息sudo apt-getupdate安装libltdl7sudo apt-getinstall libltdl7下载最新版本的安装包(其他版本可以在docker下载地址找到)wget https://downl..._非精简版乌班图docker镜像

推荐文章

热门文章

相关标签