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

智能推荐

计算机网络sequence number,TCP协议中SequenceNumber和Ack Numbe-程序员宅基地

文章浏览阅读1k次。Sequence Numberlzyws7393074532892018-04-25Number Sequenceqq_391789932452017-09-21理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)hebbely9822017-01-14Number Sequence(规律)l25336363712902017-07-18Numb..._ack num

计算机系统启动项设置密码,电脑开机第一道密码怎么设置 - 卡饭网-程序员宅基地

文章浏览阅读5.9k次。笔记本电脑怎么进CMOS密码巧设置笔记本电脑怎么进CMOS密码巧设置 笔记本电脑为了保护用户的数据安全,往往采用加密的方式,最常见的还是CMOS密码加密技术。为了让你的重要数据更加安全,你可能需要设置不同的密码,这也就要求你记住许多密码。对于笔记本电脑用户来说,真的需要设置一道道密码关卡吗?非也非也! 一、认识与设置笔记本电脑的CMOS密码 笔记本电脑的CMOS密码大致分为超级密码(Supervi..._电脑第一道密码修改

VulnHub靶机-Jangow: 1.0.1_jangow01-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏5次。迟到的文章,就当库存发出来吧~_jangow01

spark实战之RDD的cache或persist操作不会触发transformation计算_spark cache和persist不生效-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏5次。默认情况下RDD的transformation是lazy形式,实际计算只有在ation时才会进行,而且rdd的计算结果默认都是临时的,用过即丢弃,每个action都会触发整个DAG的从头开始计算,因此在迭代计算时都会想到用cache或persist进结果进行缓存。敝人看到很多资料或书籍有的说是persist或cache会触发transformation真正执行计算,有的说是不会!敝人亲自实验了一把..._spark cache和persist不生效

html文字滚动_html滚动-程序员宅基地

文章浏览阅读2.4k次。HTML之marquee(文字滚动)详解语法:以下是一个最简单的例子:代码如下:Hello, World下面这两个事件经常用到:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动代码如下:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动 onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动这是一个完_html滚动

leecode++理解_auto row : rows-程序员宅基地

leecode++理解:本文介绍了一些LeetCode题目的解析和思路,包括两数相加、寻找有序数组的中位数、最长字串、整数反转等。还讨论了一些下标规律和正则表达式匹配问题。

随便推点

信号发生器设计VHDL代码Quartus仿真_vhdl正弦波信号发生器-程序员宅基地

文章浏览阅读1k次,点赞20次,收藏22次。代码功能:信号发生器设计信号发生器由波形选择开关控制波形的输出,分别能输出正弦波、方汉和三角波三种波形,波形的周期为2秒(由40M有源晶振分频控制)。考虑程序的容量,每种波形在一个周期内均取16个取样点,每个样点数据是8位(数值范围:00000000~1111111)要求将D/A变换前的8位二进数据(以十进制方式)输出到数码管动态演示出来。_vhdl正弦波信号发生器

笔记-Java线程概述_java 线程概述-程序员宅基地

文章浏览阅读629次。Java Concurrency in Practice中对线程安全的定义:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就是线程安全的。显然只有资源竞争时才会导致线程不安全,因此无状态对象永远是线程安全的 。过多的同步会产生死锁的问题,死锁属于程序运行的时_java 线程概述

MATLAB从文件读取数据_matlab读取数据-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏61次。读取表单Sheet2中部分信息。_matlab读取数据

【实践】基于spark的CF实现及优化_spark cf-程序员宅基地

文章浏览阅读1.4w次。最近项目中用到ItemBased Collaborative Filtering,实践过spark mllib中的ALS,但是因为其中涉及到降维操作,大数据量的计算实在不能恭维。所以自己实践实现基于spark的分布式cf,已经做了部分优化。目测运行效率还不错。以下代码package modelimport org.apache.spark.broadcast.Broadcastimp_spark cf

ijkplayer直播播放器使用经验之谈——卡顿优化和秒开实现_libijkplayer 播放直播流卡顿-程序员宅基地

文章浏览阅读1.8w次。 在我的博客移动平台播放器ijkplayer开源框架分析(以IOS源码为例),大致介绍了一下ijkplayer的基本函数调用顺序和主要线程作用,本博客想介绍一下在直播应用中,针对卡顿和秒开做的一些优化,本优化经验主要是用在Android系统上,ios上也可以借鉴,按本博客修改代码,网络带宽足够的情况下,音视频播放基本流畅不卡顿,首屏时间在500ms以内。 首先来看直播应用中的卡顿。直..._libijkplayer 播放直播流卡顿

数据挖掘实践(金融风控-贷款违约预测)(三):特征工程_金融风控(大数据)特征工程-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏28次。数据挖掘实践(金融风控-贷款违约预测)(三):特征工程目录数据挖掘实践(金融风控-贷款违约预测)(三):特征工程1.引言2.特征预处理2.1缺失值填充2.2时间格式处理2.3类别特征处理3.异常值处理3.1 检测异常的方法一:正态分布法3.2 检测异常的方法二:箱型图3.3异常值的处理方法4.数据分桶5.特征交互6.特征编码6.1 labelEncode 直接放入树模型中6.2 逻辑回归等模型要单独增加的特征工程7.特征选择7.1 Filter7.2 Wrapper (Recursive feature _金融风控(大数据)特征工程