Android ExpandListView的用法(补上昨天的)(今天自习)
今天自习写ExpandListView的作业,昨天没写博客就是去写作业去了。
今天来说昨天内容吧!
其实ExpandListView和ListView的用法大同小异。
首先就是创建一个自己的适配器(现在好像只会写自定义的适配器)
创建的时候继承BaseExpandListView,然后实现里面的方法。
这里一个个方法重写下,出来getView的两个方法难写点,其他的还都简单。
一个个解释哈,我们刚开始实现接口的抽象方法后,创建自己需要的字符串,
就拿手机QQ的联系人界面来说
group的作用就是给分组命名的字符串,每个都有一个字符串,所以用字符串数组
child就是你分组的人,以此类推是不是就是二维字符串数组。
至于geyan我这边想写那个个性签名的那些话传过来
getGroupCount:返回分组的个数
getChildrenCount:分组里面的二级菜单个数。(二级菜单就是联系人,比如特别关心里面的张三)
getGroup:就是获得这个组当前的下标的值
getChild:就是获得这个二级菜单当前的下标的值
getGroupId:给每个分组分配id=下标
getChildId:你懂的
hasStableIds:这个是看数据是否稳定,就是是否有重复id,大概这个意思,我一般是true,稳定总 是好的,当然视情况而定吧
getGroupView:这个懂吧,先得在layout里写好布局,然后实例化连接它。然后就给它连接控件进行操作。
getChildView:这个就是给二级菜单用的布局,也得写好布局xml,千万不要搞混了,或者传个控件给实例化。
isChildSelectable:这个是说二级菜单可不可选。 继续,我们写好适配器就是连接ExpandListView。
自己写的适配器new个对象,三个参数就是一个字符串数组做分组,两个字符串二维数组做二级菜单的内容。然后就是监听,第一个是二级菜单的监听,第二个是分组的监听。
还是比较简单的,然后自己注意写好三个布局,应该不会难看(本活动的布局,分组的布局,二级菜单的布局)
我做出的效果就是如图:
做了一些修饰,其实我把这个融入到我昨天写的界面里去了。
会不会奇怪为啥有那个三角形不打开是右边,打开却在下面。这里说下选择器。
在drawable里面创建一个select.xml。然后在里面写:
这里的作用就是看你这个是不是展开的,如果不是就右三角形,这两个三角形是在阿里巴巴矢量图标库里下载过来的。
怎么用呢?,展开是expand,我们学的也是ExpandListView,肯定是在布局中找到控件并搞地址。
可以看到groupIndicator,这个就是它的指针图标,选择器就相当于监听。
l
补充个内容,就是图片的裁剪,变圆形,这个得自己写个Bitmap,
package com.example.listview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class MyImage extends androidx.appcompat.widget.AppCompatImageView {
private Paint paint = new Paint();
public MyImage(Context context) {
super(context);
}
public MyImage(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyImage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//将头像按比例缩放
private Bitmap scaleBitmap(Bitmap bitmap){
int width = getWidth();
//一定要强转成float 不然有可能因为精度不够 出现 scale为0 的错误
float scale = (float)width/(float)bitmap.getWidth();
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
//将原始图像裁剪成正方形
private Bitmap dealRawBitmap(Bitmap bitmap){
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//获取宽度
int minWidth = width > height ? height:width ;
//计算正方形的范围
int leftTopX = (width - minWidth)/2;
int leftTopY = (height - minWidth)/2;
//裁剪成正方形
Bitmap newBitmap = Bitmap.createBitmap(bitmap,leftTopX,leftTopY,minWidth,minWidth,null,false);
return scaleBitmap(newBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (null != drawable) {
Bitmap rawBitmap =((BitmapDrawable)drawable).getBitmap();
//处理Bitmap 转成正方形
Bitmap newBitmap = dealRawBitmap(rawBitmap);
//将newBitmap 转换成圆形
Bitmap circleBitmap = toRoundCorner(newBitmap, 14);
final Rect rect = new Rect(0, 0, circleBitmap.getWidth(), circleBitmap.getHeight());
paint.reset();
//绘制到画布上
canvas.drawBitmap(circleBitmap, rect, rect, paint);
} else {
super.onDraw(canvas);
}
}
private Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
//指定为 ARGB_4444 可以减小图片大小
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Rect rect = new Rect(0, 0,bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
int x = bitmap.getWidth();
canvas.drawCircle(x / 2, x / 2, x / 2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
这个就是自己创个class,写进去就行
然后自己用图片的时候就<MyImage 等提示找到那个路径和自己差不多的,
<com.example.listview.MyImage
android:id="@+id/image_p"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="10dp"
android:src="@drawable/pika1" />
用法和ImageView一样。 再提一下自己改标题,每次是不是看着那个标题总是自己的项目名称,是不是看着不爽。
我们先写一个自己想要的标题,本牛崽这边是title_right
再到你的活动相对应的布局里去调用这句话
<include layout="@layout/title_right"></include>
你会发现有两个标题在那排着,
这个时候得到活动里去隐藏默认的标题。
在onCreate方法里,
ActionBar actionbar = getSupportActionBar();
if (actionbar != null) {
actionbar.hide();
}
本牛崽百度搞到的,
就这些了。。。好像还比较简单吧,得自己多打,现在有的兄弟姐妹前面的代码没打,每天听理论,现在都不知道下手了。
一定得多敲,脑子记忆会刷新,手指记忆会记很久。
Android ExpandListView的用法(补上昨天的)(今天自习)的更多相关文章
- Android开发之Tween(补间动画)
在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...
- 【Android学习】android:layout_weight的用法实例
对于android:layout_weight的用法,用下面的例子来说明: <LinearLayout xmlns:android="http://schemas.android.co ...
- Android之Adapter用法总结-(转)
Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid Vie ...
- Android之Adapter用法总结(转)
Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid Vie ...
- Android webservice的用法详细讲解
Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...
- Android Map新用法:MapFragment应用
MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView,但是,MapFragment 这种的局限在于,必须要安装Google Play ...
- Android之Adapter用法总结
http://blog.csdn.net/fznpcy/article/details/8658155 Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器 ...
- xamarin android viewpager的用法
1.什么是ViewPager 通过手势滑动可以完成view的切换,一般是用来app的引导页或则实现图片轮播,类似网页上的banner轮播. Adnroid 3.0后引入的一个UI控件,在xamarin ...
随机推荐
- bzoj2160拉拉队排练
bzoj2160拉拉队排练 题意: 给一个字符串,求最长的k个回文子串(此处回文子串长度必须为奇数)长度的乘积.字符串长度≤1000000 题解: 先用manacher预处理出第i个字符为中心的最长回 ...
- python---Flask使用教程-加载静态文件
flask的静态文件,一般放在static目录下,前端页面放在templates下(而且这两个名字是定死的(static,templates)),目录结构如图: 模板(index.html)里加载静态 ...
- 初识Java对象
初始Java对象 本文的概述顺序 1什么是面向对象编程(面向对象编程与 面向过程编程的区别) 2类和对象的的关系 3类的定义 4对象的创建 5对象使用的一些细节 5.1对象在内存中的产生及分布 5.2 ...
- 工作3年java面试题整理(自用)
基础题目 1.Java线程的状态 一. 线程状态类型:1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该 ...
- OSCP Learning Notes - Enumeration(1)
Installing Kioptrix: Level 1 Download the vm machine form https://www.vulnhub.com/entry/kioptrix-lev ...
- 012.Nginx负载均衡
一 负载均衡概述 1.1 负载均衡介绍 负载均衡是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验.对于Web应用,通过负载均衡,可以将一台服务器的工作扩展到多台服务 ...
- pyenv虚拟环境安装
安装过程 配置yum源 # curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ...
- iview实战 : 树形组件自定义
Tree树形组件是 iview 中相对复杂的一个组件. 自定义节点内容 使用强大的 Render 函数可以自定义节点显示内容和交互,比如添加图标,按钮等. ——官方文档 但官方的 example 只有 ...
- MySQL数据库的安装方法
- matplotlib常见图表绘制——极坐标图-雷达图、极轴图
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:斑点鱼 极坐标轴 调用subplot()创建子图时通过设置proje ...