ListView的深入简出的使用

ListView深入简出(一)

了解ListView

ListView(由多个相同视图的行组成的列表)
继承结构如下(可以自己点进去看下)
首先listView继承ABsListView
在这里插入图片描述
ABsListView继承了AdapterView
在这里插入图片描述
AdapterView继承ViewGroup
在这里插入图片描述
ViewGroup继承了View
在这里插入图片描述
所以明确的第一点ListView本质上还是一个控件。

ListView的基本使用

Layout中如何展示ListView

在Layout中展示ListView与TextView,Button的使用类似.
 <ListView
        android:id="@+id/main_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
 </ListView>

但是与普通控件的不同之处是,ListView这样做只是一个视图,并没有真实东西.
这个时候就还需要一个Adapter .
Adapter是什么?适配器!!!!

Adapter是怎么做适配的呢?

adapter怎么适配的

左边每一行的item都是一个View,但是光有布局是不行的,还要有数据填充,(就跟单纯线性布局没有是不会在界面有任何效果是差不多的道理),那么右边就是数据了。
通俗而言,就是每一台台式电脑都有一个屏幕和一个主机,item相当于屏幕,data相当于主机,没有主机光有屏幕是没有用的。
所以Adapter的作用,就是让屏幕和主机绑定起来,形成一台完整的台式电脑。

ListView的实现步骤:(将由一个简单的案例演示)

  1. 在Layout中创建ListView
 <ListView
        android:id="@+id/main_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
 </ListView>
拿到ListView,可以在后面对它进行处理
  ListView main_list_view = findViewById(R.id.main_list_view);
  1. 创建每一行item的layout
<?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"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/app_image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@android:drawable/star_big_on"
        />
    <TextView
        android:id="@+id/app_name"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center_vertical"
        android:paddingLeft="6dp"
        android:textSize="20sp"
        android:text="@string/app_name"/>

</LinearLayout>

在这里插入图片描述

  1. 创建每一行的数据 (对应关系)
    这里暂时创建一个纯文本的集合
//创建一个String类型的集合
List<String> appNames = new ArrayList<>();
appName.add("QQ");
appName.add("Wechat");
appName.add("浏览器");
  1. 用adapter 将数据填充数据item中
    这里演示使用的是BaseAdapter,一个功能比较强大的适配器。
    BseAdapter是一个抽象类,常用于和Android一些控件如ListView,GridView,Spinner等控件结合来显示数据的一个适配器,在安卓中占有很重要的位置。结构如下:
    在这里插入图片描述
    BaseAdapter的使用步骤:由于是一个抽象类,所以在使用前,我们需要定义一个类来继承该类,并且要实现对应的抽象方法。
    回到本次演示,我们一起观看:
    我们自定义了一个MyAdapter类继承了BaseAdapter并实现了它的抽象方法。
    其中:
    getCount() 一共有多少条数据
    getItem(int i) 获取当前i这个位置这一条的数据
    getItemId(int i) 返回每个Item 的ID
    最重要的方法:

    getView(int i,View view,ViewGroup viewgroup) 重绘视图

调用的次数是由getCount() 这个方法确定的,并且这个方法有一个返回值,
返回值就是我们要返回的视图对象。

**参数介绍: i 就是位置 从0开始
view 就是每一项中要显示的view,listview中的每一行
viewgroup 就是父窗体,相当于此处的listview自己。**

在这里插入图片描述
在这里插入图片描述
我们在getView中通过加载我们自定义的item文件去得到了item文件中ImageView和TextView,相当于这一行的视图对象。
然后把构造函数中我们传递过来的视图对象的数据设置到了TextView中,(此时我们并没有去操作ImageView的内容,所以还是会显示本身我在布局文件中设置的图片),并且返回了view(当前这一行对象).
接着我回到oncreate方法为我的listview绑定了适配器,记得我前面说的,两者缺一不可,需要结合,这样我们的listView就有数据了。
在这里插入图片描述
在这里插入图片描述
接下来我们用做一个获取系统所有应用的图标和文本并显示在listview上的小demo:
首先我们定义了一个取出系统所有应用信息的 方法:

 //取出系统所有应用信息
    private List<ResolveInfo> getAppInfos(){
        Intent intent = new Intent(Intent.ACTION_MAIN,null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        //返回应用的pakgeManager查询出来的应用信息列表
        return getPackageManager().queryIntentActivities(intent,0);
    }

然后和之前一样在adapter的getView中获取视图设置数据返回视图,

 @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            //处理view -- > data 适配的过程 填充数据
            //把layout 文件 变成 java对象
            view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_app_list,null);
            //读取布局的视图 通过view
            ImageView app_image = view.findViewById(R.id.app_image);
            TextView app_name =view.findViewById(R.id.app_name);
            //取出数据 设置数据
            //每次getView设置这一行的视图数据
            app_name.setText(appNames.get(i).activityInfo.loadLabel(getPackageManager()));
            app_image.setImageDrawable(appNames.get(i).activityInfo.loadIcon(getPackageManager()));
            return view;
        }

最后绑定适配器,就ok啦

  ListView main_list_view = findViewById(R.id.main_list_view);
        //得到所有应用数据传入Adapter 为listView设置适配器
  main_list_view.setAdapter(new MyAdapter(getAppInfos()));

第一章就暂时到这啦,晚点我们再一起继续深入学习ListView,

发布了18 篇原创文章 · 获赞 2 · 访问量 1495

猜你喜欢

转载自blog.csdn.net/AppWhite_Star/article/details/103498919