版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章 基础控件Android 程序设计基础回顾n 文本控件的常用属性n android:textColor设置文本框的文字内容颜色n android:textSize设置文本框的文字内容大小。n android:text设置文本内容n 对话框的常用方法n setTitle设置对话框标题。n setMessage设置对话框内容。n setPositiveButton设置确定按钮的点击事件n 单选按钮或复选按钮可使用 setOnCheckedChangeListener() 方法监听状态的改变,也可将单选按钮放置在RadioGroup 控件中,使用 setOnCheckedChangeListe
2、ner() 方法监听 RadioGroup 控件的状态改12341234本章内容ListView 控件基础ListView 控件进阶RecyclerView 控件基础RecyclerView 控件进阶使用 ListView 控件实现 QQ 联系人列表使用 ListView 控件实现通讯录联系人列表使用 RecyclerView 控件实现 QQ 联系人列表使用 RecyclerView 控件的瀑布流布局实现图片浏览的功能讲解时间: 分钟实践时间: 分钟技术讲解实践练习25203.1ListView 控件基础1.使用 ListView 控件实现 QQ 联系人列表3.1.1 ListView 控件的
3、简单用法nListView 控件允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕n由于手机屏幕的空间有限,能够一次性在屏幕上显示的内容并不多,当应用中有大量数据需要展示的时候,需要借助 ListView 控件来实现3.1.1 ListView 控件的简单用法public class MainActivity extends AppCompatActivity private String data = Apple,Banana,Orange,Watermelon,Pear,Grape,Pineapple,Strawberry,Cherry,Mango
4、,Apple,Banana,Orange,Watermelon,Pear,Grape,Pineapple,Strawberry,Cherry,Mango;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ArrayAdapter adapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_list_ite
5、m_1,data);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);android.R.layout.simple_list_item_1 作为 ListView 控件子项布局的 id,这是一个 Android 内置的布局文件,里面只有一个 TextView,可用于简单地显示一段文本3.1.2 定制 ListView 控件的界面n只显示一行文本的 ListView 控件过于单调,开发者可以对 ListView 控件的界面进行定制,让它显示出更加丰富的内容3.1.2
6、定制 ListView 控件的界面public class Fruit private String name; / 水果的名字private int imageId; / 水果对应图片的资源 idpublic Fruit(String name, int imageId) = name;this.imageId = imageId;public String getName() return name;public int getImageId() return imageId;public class FruitAdapter extends ArrayAdapter
7、private int resourceId;public FruitAdapter(NonNull Context context,LayoutRes int resource, NonNull List objects) super(context, resource, objects);resourceId = resource;NonNullOverridepublic View getView(int position, Nullable View convertView,NonNull ViewGroup parent) Fruit fruit = getItem(position
8、);View view = LayoutInflater.from(getContext().inflate(resourceId,parent,false);ImageView fruitImage = view.findViewById(R.id.fruit_image);TextView fruitName = view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId();fruitName.setText(fruit.getName();return view;public class
9、 MainActivity extends AppCompatActivity private List fruitList = new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_
10、item,fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);private void initFruits() for(int i=0;i2;i+) Fruit apple = new Fruit(Apple,R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit(Banana,R.drawable.banana_pic);fruitList.add(banana);
11、Fruit orange = new Fruit(Orange,R.drawable.orange_pic);fruitList.add(orange);Fruit watermelon = new Fruit(Watermelon,R.drawable.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit(Pear,R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit(Grape,R.drawable.grape_pic);fruitList
12、.add(grape);Fruit pineapple = new Fruit(Pineapple,R.drawable.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit(Strawberry,R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit(Cherry,R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit(Mango
13、,R.drawable.mango_pic);fruitList.add(mango);需求说明实践时间: 分钟3.1.3 学生实践练习n在界面中使用 ListView 控件显示 QQ 好友列表联系人,共显示 20 个联系人,通过上下滑动屏幕查看所有的联系人n列表的左边显示联系人的头像,右边显示联系人的姓名20实现思路3.1.3 学生实践练习n 打开 Android Studio 开发工具,创建 Android 项目,命名“HelloWorld”。n 在工程中添加 Activityn 在布局文件中添加 RelativeLayout 布局n 在 RelativeLayout 布局中添加 List
14、View 控件,设置 ListView 控件的宽度和高度为 match_parentn 在工程中添加联系人实体类,在实体类中添加联系人姓名和联系人图片对应的资源 id,并添加构造方法和get() 方法实现思路n创建 ListView 控件子项的布局文件,在布局中添加一个 ImageView 控件和一个 TextView 控件,分别用来显示联系人的图像和姓名n创建一个自定义的适配器,适配器继承自 ArrayAdapter,并将泛型指定为联系人实体类n在 Activity 中创建适配器对象,创建数据,并将数据通过适配器绑定到 ListView 控件上讲解时间: 分钟实践时间: 分钟技术讲解实践练习
15、25203.2ListView 控件进阶1.提升 ListView 控件的运行效率(一)2.提升 ListView 控件的运行效率(二)3.ListView 控件的点击事件1. 使用 ListView 控件实现通讯录联系人列表3.2.1 提升 ListView 控件的运行效率(一)n ListView 控件的运行效率很低,因为在 FruitAdapter 的 getView() 方法中,每次都将布局重复加载了一遍,当 ListView 控件快速滚动的时候,就会成为性能的瓶颈n适配器的 getView() 方法中有一个 convertView 参数,这个参数用于将之前加载好的布局进行缓存,以便之
16、后可以重用,可提升 ListView 控件的运行效率3.2.1 提升 ListView 控件的运行效率(一)public class FruitAdapter extends ArrayAdapter 省略NonNullOverridepublic View getView(int position, Nullable View convertView, NonNull ViewGroup parent) Fruit fruit = getItem(position);View view;if(convertView = null) view = LayoutInflater.from(get
17、Context().inflate(resourceId,parent,false); else view = convertView;ImageView fruitImage = view.findViewById(R.id.fruit_image);TextView fruitName = view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId();fruitName.setText(fruit.getName();return view;在 getView() 方法中进行判断,如果 c
18、onvertView 参数为 null,则使用 LayoutInflater 加载布局;如果不为 null,则直接对convertView 参数进行重用,这样做可以快速地提高 ListView 控件的运行效率3.2.2 提升 ListView 控件的运行效率(二)n上一节中对 ListView 控件进行了优化,去除了重复加载布局,使用缓存进行加载。但每次在适配器的 getView()方法中还是会调用 View 的 findViewById() 方法来获取一次控件的实例,这时可以借助一个 ViewHolder 来对这部分性能进行优化3.2.2 提升 ListView 控件的运行效率(二)publ
19、ic class FruitAdapter extends ArrayAdapter 省略NonNullOverridepublic View getView(int position, Nullable View convertView,NonNull ViewGroup parent) Fruit fruit = getItem(position);View view;ViewHolder viewHolder;if(convertView = null) view = LayoutInflater.from(getContext().inflate(resourceId,parent,f
20、alse);viewHolder = new ViewHolder();viewHolder.fruitImage = view.findViewById(R.id.fruit_image);viewHolder.fruitName = view.findViewById(R.id.fruit_name);view.setTag(viewHolder); else view = convertView;viewHolder = (ViewHolder) view.getTag();viewHolder.fruitImage.setImageResource(fruit.getImageId()
21、;viewHolder.fruitName.setText(fruit.getName();return view;class ViewHolder ImageView fruitImage;TextView fruitName;所有的控件实例都缓存在了 ViewHolder 中,没有必要每次都通过 findViewById() 的方法来获取控件实例3.2.3 ListView 控件的点击事件nListView 控件的滚动毕竟只是满足了我们视觉上的效果,如果 ListView 控件的子项不能点击的话,这个控件就没有什么实际的用途了3.2.3 ListView 控件的点击事件public cla
22、ss MainActivity extends AppCompatActivity private List fruitList = new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.frui
23、t_item,fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() Overridepublic void onItemClick(AdapterView adapterView, View view, int i, long l) Fruit fruit = fruitList.get(i);Toast.mak
24、eText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show(););省略 .需求说明实践时间: 分钟3.2.4 学生实践练习n在界面上显示手机的联系人列表,共显示 20 个联系人,通过上下滑动屏幕查看所有的联系人n列表的左边显示联系人的头像,右边显示联系人的姓名和电话号码n点击联系人,弹出“确认拨号”的对话框20实现思路3.2.4 学生实践练习n打开 Android Studio 开发工具,创建 Android 项目,命名为“HelloWorld”n在工程中添加 Activityn在布局文件中添加 RelativeLayou
25、t 布局n在 RelativeLayout 布局中添加 ListView 控件,设置 ListView 控件的宽度和高度为 match_parent实现思路3.2.4 学生实践练习n在工程中添加联系人实体类,在实体类中分别添加联系人姓名、电话号码和联系人图片对应的资源 id,并添加构造方法和 get() 方法。n创建 ListView 控件子项的布局文件,在布局中添加一个ImageView 控件和一个 TextView 控件,分别用来显示联系人的图像和详细信息(TextView 控件显示信息的格式为:联系人姓名 + 换行符(n)+ 电话号码)n创建一个自定义的适配器,适配器继承自 ArrayA
26、dapter,并将泛型指定为联系人实体类实现思路3.2.4 学生实践练习n在 Activity 中创建适配器对象,创建数据,并将数据通过适配器绑定到 ListView 控件上n使用 setOnItemClickListener() 方法为 ListView 控件注册一个监听器,在回调方法中可以通过 position参数(第二个参数)获取当前点击子项的联系人实例,并弹出 AlertDialog 对话框,将联系人的信息显示到对话框上讲解时间: 分钟实践时间: 分钟技术讲解实践练习25203.3RecyclerView 控件基础1.RecyclerView 控件的基本用法1. 使用 Recycler
27、View 控件实现 QQ 联系人列表3.3.1 RecyclerView 控件的基本用法nRecyclerView 控件属于新增的组件n为了让 RecyclerView 控件在所有的 Android 版本上都能使用,Android 团队将 RecyclerView 控件定义到了support 库中n要使用 RecyclerView 这个控件,首先需要在项目的build.gradle 中添加相应的依赖库才行3.3.1 RecyclerView 控件的基本用法dependencies compile fileTree(include: *.jar, dir: libs)androidTestCom
28、pile(com.android.support.test.espresso:espresso-core:2.2.2, exclude group: com.android.support, module: support-annotations)compile com.android.support:appcompat-v7:26.+compile com.android.support.constraint:constraint-layout:1.0.2testCompile junit:junit:4.12compile com.android.support:recyclerview-
29、v7:26.0.0-alpha11. 选择 module2.选择Dependencies3.点击“+”,选择第一项4. 输入“v7”, 点击搜索按钮,在搜索结果中选择“recyclerview”,点击“确定”3.3.1 RecyclerView 控件的基本用法public class FruitAdapter extends RecyclerView.Adapter private List mFruitList;public FruitAdapter(List mFruitList) this.mFruitList = mFruitList;Overridepublic ViewHolder
30、 onCreateViewHolder(ViewGroup parent, int viewType) View view = LayoutInflater.from(parent.getContext().inflate(R.layout.fruit_item,parent,false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;Overridepublic void onBindViewHolder(ViewHolder holder, int position) Fruit fruit = mFruitL
31、ist.get(position);holder.fruitImage.setImageResource(fruit.getImageId();holder.fruitName.setText(fruit.getName();Overridepublic int getItemCount() return mFruitList.size();static class ViewHolder extends RecyclerView.ViewHolder ImageView fruitImage;TextView fruitName;public ViewHolder(View itemView)
32、 super(itemView);fruitImage = itemView.findViewById(R.id.fruit_image);fruitName = itemView.findViewById(R.id.fruit_name);public class MainActivity extends AppCompatActivity private List fruitList = new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanc
33、eState);setContentView(R.layout.activity_main);initFruits();/ 初始化水果数据RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);recyclerView.setLayoutManager(layoutManager);FruitAdapter adapter = new FruitAdapter(frui
34、tList);recyclerView.setAdapter(adapter);private void initFruits() for(int i=0;i2;i+) Fruit apple = new Fruit(Apple,R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit(Banana,R.drawable.banana_pic);fruitList.add(banana);Fruit orange = new Fruit(Orange,R.drawable.orange_pic);fruitList.
35、add(orange);Fruit watermelon = new Fruit(Watermelon,R.drawable.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit(Pear,R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit(Grape,R.drawable.grape_pic);fruitList.add(grape);Fruit pineapple = new Fruit(Pineapple,R.drawable.pine
36、apple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit(Strawberry,R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit(Cherry,R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit(Mango,R.drawable.mango_pic);fruitList.add(mango);需求说明实践时间: 分钟3.3.2 学生实
37、践练习n在界面中使用 RecyclerView 控件显示 QQ 好友列表联系人,共显示 20 个联系人,通过上下滑动屏幕查看所有的联系人n列表的左边显示联系人的头像,右边显示联系人的姓名20实现思路3.3.2 学生实践练习n打开 Android Studio 开发工具,创建 Android 项目,命名为“HelloWorld”n在工程中添加 Activityn在布局文件中添加 RelativeLayout 布局n在 RelativeLayout 布局中添加 RecyclerView 控件,设置 RecyclerView 控件的宽度和高度为 match_parent实现思路3.3.2 学生实践练
38、习n 在工程中添加联系人实体类,在实体类中添加联系人姓名和联系人图片对应的资源 id,并添加构造方法和get 方法n 创建 RecyclerView 控件子项的布局文件,在布局中添加一个 ImageView 控件和一个 TextView 控件,分别用来显示联系人的图像和姓名n 创建一个自定义的适配器,适配器继承自 RecyclerView.Adapter,并将泛型指定为适配器的内部类 ViewHolder,内部类 ViewHolder 继承自 RecyclerView.ViewHoldern 在 Activity 中创建适配器对象,创建数据,创建 LinearLayoutManager 对象,
39、将 LinearLayoutManager对象设置到 RecyclerView 控件中,并将数据通过适配器绑定到 RecyclerView 控件上讲解时间: 分钟实践时间: 分钟技术讲解实践练习25203.4RecyclerView 控件进阶1.实现横向滚动和瀑布流布局2.RecyclerView 控件的内置布局3.RecyclerView 控件点击事件1.使用 RecyclerView 控件的瀑布流布局实现图片浏览的功能3.4.1 实现横向滚动和瀑布流布局nListView 控件的扩展性不好,它只能实现纵向滚动的效果,如果想进行横向滚动的话,ListView 控件就做不到了,而 Recycl
40、erView 控件却可以做到3.4.1 实现横向滚动和瀑布流布局public class MainActivity extends AppCompatActivity private List fruitList = new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();/ 初始化水果数据RecyclerView recycle
41、rView = (RecyclerView) findViewById(R.id.recycler_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(layoutManager);FruitAdapter adapter = new FruitAdapter(fruitList);recyclerView.setAdapt
42、er(adapter);省略3.4.2 RecyclerView 控件的内置布局n除了 LinearLayoutManager 之外,RecyclerView 控件还提供了GridLayoutManager 和 StaggeredGridLayoutManager这两种内置的布局排列方式nGridLayoutManager 用于实现网格布局StaggeredGridLayoutManager 用于实现瀑布流布局3.4.2 RecyclerView 控件的内置布局public class MainActivity extends AppCompatActivity private List fr
43、uitList = new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();/ 初始化水果数据RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);StaggeredGridLayoutManager layoutManager =
44、newStaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);recyclerView.setLayoutManager(layoutManager);FruitAdapter adapter = new FruitAdapter(fruitList);recyclerView.setAdapter(adapter);private void initFruits() for(int i=0;i2;i+) Fruit apple = new Fruit(getRandomLengthName(Apple),R.draw
45、able.apple_pic);fruitList.add(apple);Fruit banana = new Fruit(getRandomLengthName(Banana),R.drawable.banana_pic);fruitList.add(banana);Fruit orange = new Fruit(getRandomLengthName(Orange),R.drawable.orange_pic);fruitList.add(orange);Fruit watermelon = new Fruit(getRandomLengthName(Watermelon),R.draw
46、able.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit(getRandomLengthName(Pear),R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit(getRandomLengthName(Grape),R.drawable.grape_pic);fruitList.add(grape);Fruit pineapple = new Fruit(getRandomLengthName(PineApple),R.drawable
47、.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit(getRandomLengthName(Strawberry),R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit(getRandomLengthName(Cherry),R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit(getRandomLengthName(Man
48、go),R.drawable.mango_pic);fruitList.add(mango);private String getRandomLengthName(String name) Random random = new Random();int length = random.nextInt(20)+1;StringBuilder stringBuilder = new StringBuilder();for (int i=0; ilength; i+) stringBuilder.append(name);return stringBuilder.toString();3.4.3
49、RecyclerView 控件点击事件nListView 控件可以通过 setOnItemClickListener() 方法注册监听器实现子项的点击事件,但 RecyclerView 控件中并没有提供类似的点击事件,RecyclerView 控件实现子项的点击事件比 ListView 控件要复杂一些nRecyclerView 控件直接摒弃了子项点击事件的监听器,所有的点击事件都由具体的 View 去注册3.4.3 RecyclerView 控件点击事件public class FruitAdapter extends RecyclerView.Adapter private List mFr
50、uitList;public FruitAdapter(List mFruitList) this.mFruitList = mFruitList;Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) View view = LayoutInflater.from(parent.getContext().inflate(R.layout.fruit_item,parent,false);final ViewHolder viewHolder = new ViewHolder(view);viewHolder.fruitView.setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View view) int position = viewHolder.getAdapterPosition();Fruit fruit = mFruitList.get(positio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年A股市场分析白皮书
- 2026年中药调剂(中药用量控制)试题及答案
- 2026年住房供给侧结构性改革背景下的政策动向
- 2025年高职财务管理(财务会计)试题及答案
- 2025年大学管理学(市场营销原理)试题及答案
- 2025年大学汉语言文学(文学概论)试题及答案
- 2025年大学大三(操作系统)进程管理实践测试试题及答案
- 2025年中职物联网应用技术(物联网感知技术)试题及答案
- 2025年大学现代种业技术(基因育种应用)试题及答案
- 2025年高职(网络营销与直播电商)直播电商阶段测试题及答案
- 2025年全国职业院校技能大赛中职组(母婴照护赛项)考试题库(含答案)
- 2026江苏盐城市阜宁县科技成果转化服务中心选调10人考试参考题库及答案解析
- 托管机构客户投诉处理流程规范
- 2026年及未来5年中国建筑用脚手架行业发展潜力分析及投资方向研究报告
- 银行客户信息安全课件
- 2026年四川单招单招考前冲刺测试题卷及答案
- 2026年全国公务员考试行测真题解析及答案
- 2025新疆华夏航空招聘笔试历年难易错考点试卷带答案解析
- (2025)70周岁以上老年人换长久驾照三力测试题库(附答案)
- 金太阳山西省名校三晋联盟2025-2026学年高三上学期12月联合考试语文(26-177C)(含答案)
- 2026年泌尿护理知识培训课件
评论
0/150
提交评论