唉,最重要的就是这个东西了,今天刚开始看么,所以也请广大读者把我当做Android的小白看,不喜勿喷,如果学错了,多加指教。我每次在学习的过程中,也仅仅是按照自己的思路去学一些比较重要的地方,所以可能忽略一些细节、组织性的东西。包括今天学习ListView,我也看了很多文章,有写的不错的,有几年前的,有坑人的,所以我尽量给大家讲明白。
ListView如何运作的?
在学习的过程中,难免会有一些自己的猜想,所以不喜勿入。
读了这么多文章,见得最多的可数适配器
、getView
、优化
这些了,但是没人系统的讲解一下这个玩意。如果大家有好的文章可以推荐一下。
- 搭建一个ListView的UI
直接使用前面创建好的项目。
先写基本的布局,如果不清楚这些可以看一下上一篇文章。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
</LinearLayout>
加入ListView, 并设置与充满父视图,我这里加了个5dp的边距,并且给listView一个id,这个id用于在activity中通过R.layout.id的方式得到我们在xml中创建的listView(不知道这么说合不合理-。-)
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/ListView"
android:padding="5dp">
</ListView>
接下来,我们像新建一个UITableViewCell一样去新建一个cell.xml
05082819-224E-47B5-B5A1-6933848951EB.png在原来的Layout文件夹右键,新建一个layout的资源文件,文件名这里就叫cell,我猜想下边的Directory name就是现在的文件夹名, 如果我们有另外一个文件夹的layout_1 的话,那就使用R.layout_1.id 去取得元素? 大家自己去试试。
新建好cell.xml之后,我们去给cell添加一些内容。这时候,我们先看一下iOS这边的样式(软件新版本的截屏):
IMG_1008.PNG看到里应该有2种cell,但今天是初步,所以我们只实现section == 1 这些东西,也就是中间的4行。我们看到,应该是有一个imageView,一个Label,还有一个箭头(箭头这里先忽略掉了)。所以我们到cell.xml中去写布局喽,相对布局。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="34dp"
android:layout_height="34dp"
android:id="@+id/imageView"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:background="#e8e8e8"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="34dp"
android:id="@+id/label"
android:layout_alignTop ="@id/imageView"
android:layout_toRightOf="@+id/imageView"
android:layout_marginRight="15dp"
android:layout_marginLeft="10dp"
/>
</RelativeLayout>
这里的布局我就随便写了、因为我的图片是34dp所以就这样写了。
最后的效果看起来是这样的:
接下来我们就要去写一个java代码了。终于不需要写xml了。
-> MainActivity.java
基本思想就是先将数据添加到ArrayList中,然后在设置SimpleAdapter适配器完成设置(之后还会直接自己继承baseAdapter写一个适配器,今天先说这个)
由于我们没一行上边显示的有一张图片以及文字,所以我们数据源的样式为
ArrayList<Map<String, String>>
这个时候运行, 出现了一个问题,RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list
看了一下,发现必须要有一个android.R.id.list
的东西,随手去google一下,把xml修改一下,android:id="@android:id/list"
, 就可以正常运行了。
- ListView的Id为固定不变的,为"@id/android:list“,ListActivity会根据id自动查找ListView引用;在 Activity 中使用 setListAdapter(adapter); 时就默认设置到了这个list上。如果按一般控件的写法 <ListView android:id="@+id/myListView" …… />,则需要 findViewById 先得到控件对像,再调用对像的 setListAdapter(adapter);
- 但如果当ListView中没有值而又想提示一句话时,那么用于指定显示提示信息的TextView的id 必须为”"@id/android:empty",提示的信息可以通过android:text进行指定。
大家自行看一下这段文字,这时候出现了基本的效果.
E6CE9715-4254-44FE-89DA-15247A1B36E5.png发现行高不对,并且文字也不是垂直居中的,我们先去xml中写死掉。
50F0E4B1-1F30-46F0-8A5C-58211BFFE449.png结果这样啦:
8D5A48B6-2224-422B-85DB-1125B576665F.png现在,图片还没有设置上去呢,我们看一下这个怎么弄。(隐约觉得要写SimpleAdapter的子类了, 因为数据绑定实在这个类里边实现的。)
我们按照猜想来实现一下,先创建一个SimpleAdapter的子类。他默认的提供了一个构造器,然后我去看SimpleAdapter类的时候发现了这个
6BDFE576-69D0-419D-86DD-0F7B66807097.png这个ViewBinder是什么鬼啊、然后看到了这句话
bound = binder.setViewValue(v, data, text);
难道这个就是设置数据?
所以我只需要设置一个ViewBinder就OK了么,看来不需要写子类啊。 删掉删掉。
现在我们来实现ViewBinder中的setViewValue的方法了。现在我对这个一无所知,所以打个Log看一下。
0FE9A16E-9C94-4252-A0F6-0CE7367417E1.png嘿嘿、懂了么、 然后看看data是什么、
BF1F33F0-9FD0-47B4-8000-93EF3AB41529.pngOK 这就得了,有一个很挫的解决办法了。
最后的代码是这样的。。。效果是这样的。。。
97AF82B8-6E8D-4B61-87BD-57F068DDBA67.png 8737B08F-6F8E-4C97-A9E3-223A41BB295F.png总的来说,实现了。 今天就到这里喽,我是个新手。。。。
明天我们自己继承BaseAdapter来完成整个设置界面的编码了。
CopyRight@Dylan 2015-1-25
网友评论