2016/4/5 17:22】
之前写listview其实写了很多次,但好像还是模模糊糊的感觉,直到今天准备写tab的时候被告诉说原理有像的地方,于是我就先来分析整理一下listview好了
 
先来一种非常自然的理解方式:
ListView其实就是一个View中放入数据呗,于是它的使用原理很可能是这样:
很好理解:
  1. 先得到数据
  2. 然后得到layout中的listview对象
  3. 然后把数据输入到对象中
 
但其实这里稍微有个实际的问题,就是第三步中,数据是不能直接传入listview中的
这也很好理解,因为
  1. 数据可能有很多种,各种各样的,肯定需要一种固定格式的数据才行,所以普通数据到这种特殊的固定格式,就需要适配器了
  2. Listview展示的不止是数据,一条条的List还有布局呢,所以你还需要传入一个布局文件
 
于是安卓中通过一个通用的适配器类(可以通过它来定制自己的)来实现这两个功能
 
这一步的变化就像这样:
    to
 
所以实际的原理示意图会是这样:
 
 

而更加实际的应用中是这样:
 
1、定义一个data类
就是一个data unit,可以定义成bean的形式
但之后真正传给adapter的其实是data list,传入一个List,然后到时候listview显示的顺序就是往List添加dataitem的顺序
代码:
public class Zchooseproject {
        private String name ;
        private String place ;
        private int imageId ;
       
        //这是从外面传入数据的方法
        public Zchooseproject(String name ,String place , int imageId) {
               this.name = name ;
               this.place = place ;
               this.imageId = imageId ;
       }
        //这两个是在外面取数据的方法
        public String getName() {
               return name ;
       }
        public String getPlace() {
               return place ;
       }
        public int getImageId() {
               return imageId ;
       }
              
}
 
2、写一个itemlayout
就是普通的Layout,但是它高度是固定的,不能是matchparent(下面的例子里这块搞得有点怪,因为里边使用了wrap_content)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip" />
</LinearLayout>
 
3、接下来需要创建一个自定义的适配器
这个适配器继承自 ArrayAdapter(是官方适配器的一种),并将泛型指定 为我们的data类。
  1. Adapter重写了父类的一组构造函数,用于将上下文、ListView子项布局的 id和数 据都传递进来
  2. 另外又重写了 getView()方法,这个方法在每个子项被滚动到屏幕内的时候 会被调用
    1. 在 getView方法中,首先通过 getItem()方法得到当前项的 Fruit实例(这个有点怪,不过没事)
    2. 然后使用 LayoutInflater来为这个子项加载我们传入的布局
    3. 接着调用 View的 findViewById()方法分别 获取到 ImageView和 TextView的实例,并分别调用它们的 setImageResource()和 setText()方 法来设置显示的图片和文字
    4. 最后将布局返回,这样我们自定义的适配器就完成了。
 
代码如下所示:
      public class Zchooseprojectadapter extends ArrayAdapter<Zchooseproject> {
               private int resourceId ;
               public Zchooseprojectadapter(Context context , int textViewResourceId,List<Zchooseproject> objects ) {
                      super(context , textViewResourceId , objects );
                      resourceId = textViewResourceId ;
              }
               @Override
               public View getView(int position, View convertView, ViewGroup parent) {
 
                     Zchooseproject fruit = getItem( position); // 获取当前项的Fruit实例
 
                     View view = LayoutInflater.from(getContext()).inflate( resourceId, null );
                     
                     ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);//获取itemlayout中的控件
                     TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
                     TextView fruitName2 = (TextView) view.findViewById(R.id.place);
 
                      fruitImage.setImageResource(fruit .getImageId());
                      fruitName.setText(fruit .getName());
                      fruitName2.setText(fruit .getPlace());
                     
                      return view ;
              }
     }
 
4、OK,在onCreate方法中装配adapter吧!
4.1、初始化data list
              private List<Zchooseproject> fruitList = new ArrayList<Zchooseproject>();
 
              Zchooseproject apple = new Zchooseproject("项目名称" ,"项目地点      项目信息", R.drawable. icon_project);
               fruitList.add(apple );
              Zchooseproject banana = new Zchooseproject("项目名称" ,"项目地点      项目信息", R.drawable. icon_project);
               fruitList.add(banana );
              Zchooseproject orange = new Zchooseproject("项目名称" ,"项目地点      项目信息", R.drawable. icon_project);
               fruitList.add(orange );
                         ......
              Zchooseproject mango = new Zchooseproject("项目名称" ,"项目地点      项目信息", R.drawable. icon_project);
               fruitList.add(mango );
4.2、装配adapter
              Zchooseprojectadapter adapter = new Zchooseprojectadapter(this ,R.layout.z_chooseprojectitem, fruitList);
 
5、结束!装配ListView
              ListView listView = (ListView) findViewById(R.id. list_view);
               listView.setAdapter( adapter);
 
因为贴图的繁琐。。。所以以上图片不完整。。。完整的在这里:

通俗易懂的ListView讲解(Adapter、图、实例)的更多相关文章

  1. Android listview与adapter用法

    listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  2. ListView 和 Adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

  3. 【转】Android listview与adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

  4. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用 ...

  5. ListView适配器Adapter介绍与优化

    一.ListView与Adapter的关系 ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: 1.View ...

  6. ListView和Adapter的配合使用以及Adapter的重写

    ListView和Adapter的使用   首先介绍一下ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: ...

  7. ListView及Adapter的使用

    一.使用ArrayAdapter 其中ArrayAdapter的构造函数有如下几个,其中resource是指每个列表项的布局文件,objects是指列表项的数据源,此处通常指一个数组 ArrayAda ...

  8. android 开发之 ListView 与Adapter 应用实践

    在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...

  9. 通俗易懂--SVM算法讲解(算法+案例)

    1.SVM讲解 新闻分类案例 SVM是一个很复杂的算法,不是一篇博文就能够讲完的,所以此篇的定位是初学者能够接受的程度,并且讲的都是SVM的一种思想,通过此篇能够使读着会使用SVM就行,具体SVM的推 ...

随机推荐

  1. openCV_java Canny边缘检测

    边缘检测的原理: 检测出图像中所有灰度值变化较大的点,而且这些点连起来构成若干线条,这些线条就称之为图像的边缘. 1986年,由John F. Canny 提出! // Canny(Mat image ...

  2. 设置360调用样式 IE调用样式

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  3. Test Tex

    \begin{equation}\label{exampleone}r = r_F+ \beta (r_M - r_F) + \epsilon\end{equation}

  4. 互联网的寒冬来了,BAT都不社招了

    一 总理上次来到创业街,是四个月,要不就是五个月前了. 之后,全国创业形势一路走红,锣鼓喧天鞭炮齐鸣.大众创业万众创新,颇有大炼钢铁亩产万斤之势,尤其在媒体上. 再之后,2015 进入下半年,风投圈的 ...

  5. 对于程序开发者看书(指实在的书而不是PDF)的好处。(个人看法而已)

    书是实在的东西.不同PDF.他能带你进入一种学习态度的环境 书上已经所列了知识点.看了.那些知识点就是你的. 第一次看,未必完全理解到里面的东西.说不定过几天,几周,几个月,甚至几年.再看.就有可能看 ...

  6. Rsync 详细配置说明

    rsync是类unix系统下的数据镜像备份工具. 它的特性如下:可以镜像保存整个目录树和文件系统.可以很容易做到保持原来文件的权限.时间.软硬链接等等.无须特殊权限即可安装.快速:第一次同步时 rsy ...

  7. fflua更新-增加对引用的支持

    简介: fflua 发布了有段时间了,很多网友都用了,并且提供了一些很好的反馈.其中一个就是c++接口注册到lua中时,对引用的支持.这样使用起来更加方便. 原有方式: fflua 中注册c++的类用 ...

  8. 日暮·第二章·烽烟传讯

    第二章 烽烟传讯   夜幕降临,整个泉州府更见喧闹,那些个白日里将养了一日的花红柳绿再也耐不住寂寞,招招摇摇着在人来人往的主街上舒展着自己的风情,妖妖娆娆地换却春风一度.    城东的招福客栈在经过了 ...

  9. 顺序执行到来的消息 actor

    在某项目里,有个 actor 需要做一些持久化的操作,这些操作耗时比较久,理应使用异步的代码来写,但是需求又强调每次只能做一个持久化操作,后来的请求应该等待.一个显然的做法是阻塞式的写,这样就能比较简 ...

  10. 小兔伴伴家庭动物园AR智能早教产品上市

    2016年6月,经过乐卓大家庭所有人的共同努力,公司旗下首款新品——小兔伴伴之<家庭动物园>3D智能学习卡正式面世. 每个孩子都应该在合适的时间去体验丰富的声音.色彩和动作,<家庭动 ...