Android基础篇(四)
AdapterView
指使用适配器来配置多个内容显示的视图,代表的有ListView(列表)、GridView(九宫格)、ExpanableListView(分组列表)
ListView
<ListViewandroid:id = "@+id/m_list"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="#55666666"android:dividerHeight="5dp" >
</ListView>
android:divider="#55666666" 分割线的资源,可以是颜色或者是图片 (@drawable/xxx)
android:dividerHeight="5dp" 分割线的高度,处理两个 item 上下间距
Java中显示内容
吐司提示
Toast 是 Android 中的应用提示,可以显示一段时间然后自动消失,不影响用户操作
//数据
private String [] ary = {"发福蝶","大鸡居","小乌堆","小海疼","丹鼎货","小凶许"};@Overridepublic void onItemClick(AdapterView<?> parent , View itemView,int position,long id){log.e("m_tag","点击了:",ary[position]);//吐司提示//Context 对象,提示内容,提示时间 ( 长或者短时间的选择 )Toast.makeText(MainActivity.this, " 点击了 :" + ary[position],Toast.LENGTH_SHORT).show();}
};//item 长按监听
private OnItemLongClickListener mOnItemLongClick = new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View itemView,int position, long id) {Log.e("m_tag", " 长按了 :" + ary[position]);return true;}
};
使用监听
//设置Item点击监听
mListView.setOnItemClickListener(mOnItemClick);
//设置item长按监听
mListView.setOnItemLongClickListener(mOnItemLongClick);
自定义适配器
1、数据源的类型封装
public class User{//头像private int icon;// 昵称private String nick;// 签名private String sign;...
}
2、每个Item的布局效果:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" ><ImageView
android:id="@+id/item_icon"android:layout_width="80dp"android:layout_height="80dp"android:src="@drawable/pic0" /><TextView
android:id="@+id/item_nick"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/item_icon"android:text="ABC"android:textSize="20sp"android:layout_marginLeft="5dp" /><TextView
android:id="@+id/item_sign"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@id/item_icon"android:layout_alignLeft="@id/item_nick"android:maxLines="3"/>
</RelativeLayout>
3、定义类继承BaseAdapter,重写getCount、getItem、getItemId、getView
public class UserAdapter extends BaseAdapter {private List<User> list;// 布局加载器:可以将 xml 布局转为 View 对象private LayoutInflater mInflater;public UserAdapter(Context context, List<User> list) {this.list = list;// 初始化布局加载器mInflater = LayoutInflater.from(context);}// 配置显示总条数@Overridepublic int getCount() {return null == list ? 0 : list.size();}// 按照位置获取数据对象@Overridepublic Object getItem(int position) {return list.get(position);}// 根据位置获取 item 的 id@Overridepublic long getItemId(int position) {return position;}// 每个 item 的显示效果@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 加载每个 item 的布局对象 ( 完成了 item_user_layout.xml 文件转为 RelativeLayout 对象 )View layout = mInflater.inflate(R.layout.item_user_layout, null);// 初始化布局中的元素ImageView ivIcon = (ImageView) layout.findViewById(R.id.item_icon);TextView tvNick = (TextView) layout.findViewById(R.id.item_nick);TextView tvSign = (TextView) layout.findViewById(R.id.item_sign);// 获取数据显示内容 ( 数据绑定,将数据显示到布局中 )User u = list.get(position);ivIcon.setImageResource(u.getIcon());tvNick.setText(u.getNick());tvSign.setText(u.getSign());return layout;}
}
4、使用
ListView userList = (ListView) findViewById(R.id.user_list);
// 初始化数据
List<User> list = new ArrayList<User>(7);
...
// 创建适配器
UserAdapter adapter = new UserAdapter(this, list);
userList.setAdapter(adapter);
适配器缓存
针对每个 item 的显示都需要通过 getView 来获取一个 View 对象,然后如果每次 getView 时都需要单独 new 的话会浪费资源,因此需要借助 getView 方法中的
convertView 来提升性能, convertView 表示的是之前的 item 显示时使用的 View 对象,但是那个 item 已经不可见了,因此可以直接使用 convertView 来显示新内容即可
@Override
public View getView(int position, View convertView, ViewGroup parent){ImageView iv;if (convertView == null) {iv = new ImageView(context);// 创建布局参数设置宽高AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 300);iv.setLayoutParams(lp);} else {iv = (ImageView) convertView;}iv.setImageResource(resIds[position]);return iv;
}
针对 item 布局中多个元素的情况,可以自己定义类关联数据的显示
class ViewHolder {ImageView ivIcon;TextView tvNick;TextView tvSign;
}
getView 处理方式
public View getView(int position, View convertView, ViewGroup parent) {Log.e("m_tag", " 显示 :" + position);ViewHolder holder;if (null == convertView) {Log.e("m_tag", " 加载布局 :" + position);// 加载每个 item 的布局对象 ( 完成了 item_user_layout.xml 文件转为 RelativeLayout 对象 )convertView = mInflater.inflate(R.layout.item_user_layout, null);holder = new ViewHolder();// 初始化布局中的元素holder.ivIcon = (ImageView) convertView.findViewById(R.id.item_icon);holder.tvNick = (TextView) convertView.findViewById(R.id.item_nick);holder.tvSign = (TextView) convertView.findViewById(R.id.item_sign);// 设置标记 ( 将已经初始化的视图保存起来,下次直接取出来显示即可 )convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}// 获取数据显示内容 ( 数据绑定,将数据显示到布局中 )User u = list.get(position);holder.ivIcon.setImageResource(u.getIcon());holder.tvNick.setText(u.getNick());holder.tvSign.setText(u.getSign());return convertView;
}
Android基础篇(四)相关推荐
- 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)...
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...
- android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...
- Android基础篇 屏幕横竖屏切换(layout-land)下篇
默认情况下Activity进行屏幕旋转会自动进行onDestroy并重新onCreate 一.非默认情况下 在AndroidManifest.xml的Activity中配置 <activitya ...
- Android基础(四):TCP/IP
Android基础(四):TCP/IP 前言 其实就个人情感来讲,我并不是很想讲这块,甚至很想把这块直接在下个篇章也就是HTTPS中一笔略过的,但是最后仔细想想过后,还是一声长叹,干吧! 先来谈谈协议 ...
- 妥妥的去面试之Android基础(四)
笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗.只有你准备充分了,那么你想得到的机会才可能有机会入你怀中. 笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给 ...
- Android基础第四篇
转载请标明出处: http://blog.csdn.net/gj782128729/article/details/52350060: 本文出自:[高境的博客] 1. Html简介 1.1. 什么是H ...
- Android 基础篇之环境配置
Android接触也有半年了本来是打算一年后开始写博客,现在写的话显得有点班门弄斧的感觉,但是听到几个前辈们教导,还是现在养成这个好习惯吧, 因为才刚刚接触半年,也不算什么大神大牛 ,所以这几篇博客只 ...
- Android基础教程(四)之-----取得手机屏幕大小DisplayMetrics的应用
2009-11-08 20:15:25 标签:Android 屏幕 手机 基础 教程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http: ...
- 【Android基础】四种基本布局
介绍 布局是一种可以用于放置很多控件的容器,可以按照一定的规律调整内部控件的位置,从而编写处精美的界面. 布局的内部除了放置控件外,还可以放置布局,通过多层布局的嵌套,可以完成比较复杂的界面实现,如下 ...
最新文章
- 解决linux 系统中Mysql 进程占用CPU 300%故障
- ctf安全竞赛入门pdf_CTF安全竞赛入门
- 【PAT乙级】1058 选择题 (20 分)
- DVWA——Sqlmap练习
- php 格式化 sub,PHP DateTime sub()用法及代码示例
- php二进制保存到本地,C# 将二进制字符串保存到本地
- 性能测试 - 响应 vs 延迟 vs 吞吐量 vs 负载 vs 扩展性 vs 压力 vs 健壮性
- 使用自定义条件触发Nintex workflow
- RNN、CNN、RNN、LSTM、CTC算法原理,pytorch实现LSTM算法
- 论文引用图片时的版权声明(Reproduced with permission, courtesy of [copyright owner])
- 电视制式 NTSC PAL SECAM
- Scratch(五):Scratch小游戏之超级玛丽
- 公开密匙(public key)和专用密匙(private key)
- 如何建立自己的【渲染农场】终极指南(2)
- kubernetes中容器(pod)间的通信及环境变量设置
- 健美运动员赛前脱水断碳_健美冠军指导书:赛前的去碳与充碳技巧(上)
- centos/redhat kernel-debug-info-xx.rpm与kernel-debuginfo-xx.rpm区别
- css+nth-child+无效,CSS nth-child()和:eq()在我的代码中不起作用
- 最新的一篇视觉Transformer综述!
- 幼儿园ppt计算机考试试题,《幼儿园课件制作》期末试卷A卷