安卓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

智能推荐

Android AppWidget(桌面小部件-音乐播放动画)_小部件 使用帧动画-程序员宅基地

文章浏览阅读4.3k次,点赞6次,收藏13次。桌面小部件基础篇:Android AppWidget (桌面小部件)音乐播放 (动画实现) 一个音乐播放的柱状图(不会上传动图,自行脑补)思路方案:1,自定义View,widget 仅支持部分控件,自定义没用,我把自定义弄完了,才想起来。所以这个方案pass2,帧动画,直接使用ImageView,也不行,无法获取子控件属性,帧动画运行不了3,LayoutAnimat..._小部件 使用帧动画

Ubuntu18.04扩展屏幕(副屏幕)不显示 登录时数字键不开问题_ubuntu18.04双屏扩展-程序员宅基地

文章浏览阅读323次。2.在附加驱动选项卡中选择独显显卡的驱动(不知道选哪个就直接选最新的就行),点击应用,重启即可。1.登录界面输入密码是NumLock不开,每次都要手动按一下才能输入密码。2.HDMI扩展屏幕不显示,信号灯亮,但是没有画面。3.查看一下独显驱动装上没(也可以不看)1.打开软件和更新功能,_ubuntu18.04双屏扩展

innoSetup生成QT安装包_inno setup qt-程序员宅基地

文章浏览阅读267次,点赞2次,收藏5次。本文介绍了如何用innoSetup完成QT程序打包。_inno setup qt

常见的通讯协议总结(USART、IIC、SPI、485、CAN)-程序员宅基地

文章浏览阅读3.8w次,点赞152次,收藏1.2k次。计算机通信是指将计算机技术和通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。按照数据传输方式的不同,可以分为串行通信和并行通信两类。_通讯协议

Word怎样使文档铺满页面充满整页并且插入空格行成巡检表_怎样把选定的段落自动充满一整页-程序员宅基地

文章浏览阅读1.2k次。Word怎样使文档铺满页面充满整页并且插入空格行成巡检表_怎样把选定的段落自动充满一整页

实现高性能ID生成器:详解Java雪花算法_java雪花算法生成id-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏11次。Java中的雪花算法(Snowflake Algorithm)是一种用于生成唯一ID的算法,可以在分布式系统环境中防止ID重复。这种算法最初由Twitter开发,用于生成Twitter的唯一ID,由于其简单易懂和高效,已成为目前最常用的生成唯一ID的算法之一。可以看到,这是一种高效、易扩展、高可用的算法,适合于生成分布式系统下唯一的ID。在以上示例代码中,SnowFlake类的构造函数接收数据中心ID和机器ID作为参数,用户可以根据自己的业务需求设置不同的数值。_java雪花算法生成id

随便推点

Ant Design vue自定义文件上传_ant design vue 上传-程序员宅基地

文章浏览阅读4.4k次。实际项目中,上传文件时实际可能需要传输一个token。方法一:1、查看vue antdesign文档https://vue.ant.design/components/upload-cn/2、使用customRequestcustomRequest 通过覆盖默认的上传行为,可以自定义自己的上传实现 Function3、定义customRequest,之前定义action行为会被覆盖,可以注释掉4、customRequest代码如下customRequest ._ant design vue 上传

C++ 学习路线:快速入门到进阶_c++学习路线-程序员宅基地

文章浏览阅读4.9k次,点赞12次,收藏92次。C/C++ 是一门底层、细粒度、功能强大、学习曲线陡峭的语言,掌握这门语言的程序员通常有着更长的生命周期以及更深的护城河。但入门门槛高也是不争的事实,这篇文章把C++学习划分为入门、进阶、深入三个阶段,每步提供相应的学习方法和资源,帮助大家更好地掌握这门语言。_c++学习路线

解决javaweb项目使用Tomcat服务在网页中的某些页面中的图片无法显示问题。_为啥单独打开html显示图片,用tomcat打开图片不显示-程序员宅基地

文章浏览阅读7.1k次,点赞5次,收藏16次。最近写了一个web项目,但在浏览器中测试,发现某些页面中的图片无法显示。原因是在加载页面时一些img标签或者css中的background-image请求了一些含有中文的图片。于是这个页面会自动向服务端发送请求获取资源,但是这个过程不会体现到地址栏的,是在后台操作的。例如我请求了一个index.html页面但是页面中有一个<img src="img/测试图片.png">标签。通过f..._为啥单独打开html显示图片,用tomcat打开图片不显示

C++ 3. 无重复字符的最长子串_c++最长子串 题目描述 现有一个字符串s,禾木想计算出其中不含有重复字母的最长连-程序员宅基地

文章浏览阅读175次。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。输入: s = “abcabcbb”输入: s = “pwwkew”输入: s = “bbbbb”_c++最长子串 题目描述 现有一个字符串s,禾木想计算出其中不含有重复字母的最长连

VS2019 创建C语言项目_vs2019怎么创建c语言项目-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏24次。VS2019 C语言项目的创建_vs2019怎么创建c语言项目

golang gin使用gorm+mysql 实现增加 删除更新 查询_golang gin以及gorm连接mysql实现单表的增删改查-程序员宅基地

文章浏览阅读1.3k次。核心代码package mainimport ( "fmt" "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" "net/http" "time")type Product struct { Id int `gorm:"primaryKey;autoIncrement" json:"id"` Number string `gorm:"uniqu_golang gin以及gorm连接mysql实现单表的增删改查

推荐文章

热门文章

相关标签