美文网首页
重拾安卓(ListView(一))

重拾安卓(ListView(一))

作者: Stark_Dylan | 来源:发表于2016-01-25 00:59 被阅读222次

    唉,最重要的就是这个东西了,今天刚开始看么,所以也请广大读者把我当做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所以就这样写了。
    最后的效果看起来是这样的:

    6420B37D-4F10-45EA-85D5-8A1EF177C230.png

    接下来我们就要去写一个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", 就可以正常运行了。

    1. ListView的Id为固定不变的,为"@id/android:list“,ListActivity会根据id自动查找ListView引用;在 Activity 中使用 setListAdapter(adapter); 时就默认设置到了这个list上。如果按一般控件的写法 <ListView android:id="@+id/myListView" …… />,则需要 findViewById 先得到控件对像,再调用对像的 setListAdapter(adapter);
    1. 但如果当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了么,看来不需要写子类啊。 删掉删掉。

    CC5D4535-CA3E-4282-8B25-F9E58614FB37.png

    现在我们来实现ViewBinder中的setViewValue的方法了。现在我对这个一无所知,所以打个Log看一下。

    0FE9A16E-9C94-4252-A0F6-0CE7367417E1.png

    嘿嘿、懂了么、 然后看看data是什么、

    BF1F33F0-9FD0-47B4-8000-93EF3AB41529.png

    OK 这就得了,有一个很挫的解决办法了。

    最后的代码是这样的。。。效果是这样的。。。

    97AF82B8-6E8D-4B61-87BD-57F068DDBA67.png 8737B08F-6F8E-4C97-A9E3-223A41BB295F.png

    总的来说,实现了。 今天就到这里喽,我是个新手。。。。

    明天我们自己继承BaseAdapter来完成整个设置界面的编码了。

    CopyRight@Dylan 2015-1-25

    相关文章

      网友评论

          本文标题:重拾安卓(ListView(一))

          本文链接:https://www.haomeiwen.com/subject/bpgrkttx.html