Android开发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是怎么做适配的呢?
左边每一行的item都是一个View,但是光有布局是不行的,还要有数据填充,(就跟单纯线性布局没有是不会在界面有任何效果是差不多的道理),那么右边就是数据了。
通俗而言,就是每一台台式电脑都有一个屏幕和一个主机,item相当于屏幕,data相当于主机,没有主机光有屏幕是没有用的。
所以Adapter的作用,就是让屏幕和主机绑定起来,形成一台完整的台式电脑。
ListView的实现步骤:(将由一个简单的案例演示)
- 在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);
- 创建每一行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>
- 创建每一行的数据 (对应关系)
这里暂时创建一个纯文本的集合
//创建一个String类型的集合
List<String> appNames = new ArrayList<>();
appName.add("QQ");
appName.add("Wechat");
appName.add("浏览器");
-
用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,