2016-03-13

Android零散

ListView中嵌套GridView

要实现分组列表这样的效果:点击ListView中的分组名称,即展开此分组显示其包含的项目。
使用ExpandableList可以实现展开这样的效果,如果对于列表中的每个可点击的标题View需要更多的定制,而不是简单的展开——例如点击全选等,那么可使用ListView嵌套GridView组合实现,ListView中嵌套的GridView应该是完全展开的——内外层都滑动的交互体验很别扭,而且实现起来麻烦。而对应的GridView可以使用setVisibility为GONE、VISIBLE这样的方式进行暂时的隐藏和打开。
为了使GridView在ListView中完全展开,那么它的height应该是个具体的数值,这里让GridView始终保持其内容的高度即可:

public class UnfoldGridView extends GridView {
public UnfoldGridView(Context context) {
super(context);
} public UnfoldGridView(Context context, AttributeSet attrs) {
super(context, attrs);
} public UnfoldGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = View.MeasureSpec.makeMeasureSpec(900000, View.MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

makeMeasureSpec中给一个很大的size,然后使用AtMost使其保持够大即可。

setAdapter和addHeaderView、addFooterView

可以使用addHeaderView和addFooterView来为ListView添加首尾的个性视图。两者都可以多次调用来添加多个header和footer。
这两个方法需要注意和setAdapter的调用顺序:

When first introduced, this method could only be called before setting the adapter with setAdapter(ListAdapter). Starting with KITKAT, this method may be called at any time. If the ListView's adapter does not extend HeaderViewListAdapter, it will be wrapped with a supporting instance of WrapperListAdapter.

所以,为了保持兼容性,无论是在API 19之前或之后,保持addHeaderView和addFooterView在setAdapter之前执行。addHeaderView如果在setAdapter之后执行,那么在API 19之前的版本直接回报错。而addFooterView在setAdapter之后执行的话,虽然不引起运行时错误——但是更迷惑的是——添加的视图是看不到了。
这个是和API Level相关的一个问题,算是谷歌的坑吧。

ListView的getItemViewType

一个页面中当要连续显示多个不同的列表时,或者间隔性地显示多种不同的View时,需要用到ListView的两个方法:

@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount();
}

getItemViewType方法需要注意的是,其定义的ITEM_XX这样的整数常量,其取值范围需要在0~getViewTypeCount()-1之间,下面是getItemViewType返回值的描述:

An integer representing the type of View. Two views should share the same type if one can be converted to the other in getView. Note: Integers must be in the range 0 to getViewTypeCount - 1. IGNORE_ITEM_VIEW_TYPE can also be returned.

在区间外的viewType值,会引起运行时的indexoutofboundexception错误,这个是ListView自身的限制。

startActivityForResult和活动的launchMode

Activity_A启动Activity_B后,需要Activity_B在完成操作后返回的一些数据:

//Activity_A中
private final int REQUEST_CODE_EDIT_ITEM = 2;
public void startPageBForEdit() {
Intent start = new Intent(this, EditActivity.class);
startActivityForResult(start, REQUEST_CODE_EDIT_ITEM);
}
//Activity_B中
public void setResult() {
Intent data = new Intent();
data.putExtra("itemDelete", true);
setResult(RESULT_OK, data);
}

在Activity_A中接收数据:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_EDIT_ITEM && resultCode == RESULT_OK) {
//成功返回结果了
}
}

上面是典型的代码片段,需要注意的是:对于对应的目标Activity启动模式(在manifest中)指定为singleTask和singleInstance的Activity,使用startActivityForResult后,当前Activity的onActivityResult会立即执行,其resultCode为RESULT_CANCEL,并且data为null.
这个从启动模式的设计上就可以理解,假设依次打开了A、B两个Activity,其中A指定为singleTask,那么在B中使用startActivityForResult打开A显然是没有意义的,因为B会从活动栈出栈,直接被destroy了。
所以,只有standard和singleTop这样的启动模式的Activity,使用startActivityForResult打开它们才可以有效的返回数据给上一个Activity,如果遇到这样的需求,需要设计好多个Activity之间的跳转关系。传递数据的方式是很多的。

Service的onStartCommand的返回值

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}

onStartCommand中的flags和其返回值都和Service的启动紧密相关。Service的定位就像是没有View的Activity,应用长期后台的情况下Service可能会暂时性被杀死(随着进程被杀死)——之后又会再次被系统启动。
每次调用startService来执行一些动作时,onStartCommand被执行,其intent参数代表分发过来的意图描述数据(intnt就是一个携带有关“要做什么”的信息对象)。
使用startService来启动一个已经运行中的,正在启动中的,重新启动中的Service时,系统会在这些不同的Service状态下对onStartCommand的调用产生一些差异。
//待续。。。

Android零散的更多相关文章

  1. Android 零散知识点整理

    Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...

  2. Android零散知识点积累

    本文仅在记录android开发中遇到的零散知识点,会不断更新... 目录 .隐藏系统标题栏 .图片尺寸及屏幕密度 3.获取顶部状态栏高度 1.隐藏系统标题栏 1)在资源文件styles.xml中定义样 ...

  3. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  4. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

  5. 一个五年 Android 开发者百度、阿里、聚美、映客的面试心经

    花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈.某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我. ...

  6. android 性能优化-电量篇

    消耗电量的几个主要原因.功能:1.大数据量的网络传输(网络)2.不停的网络切换(网络)3.解析大量的数据(CPU) 关于网络方面的优化: .网络请求之前,检查网络连接.没有网络连接不进行请求 .判断网 ...

  7. Android 多媒体视频播放一( 多媒体理解与经验分享)

    前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...

  8. Android应用开发-数据存储和界面展现(一)(重制版)

    常见布局 相对布局(RelativeLayout) 相对布局下控件默认位置都是左上角(左对齐.顶部对齐父元素),控件之间可以重叠 可以相对于父元素上下左右对齐,相对于父元素水平居中.竖直居中.水平竖直 ...

  9. Android性能优化典范

    来源:http://hukai.me/android-performance-patterns/#jtss-tsina 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主 ...

随机推荐

  1. windows下安装easy_install, pip 及whl文件安装方法

    转:http://www.cnblogs.com/wu-wenmin/p/4250330.html 写在前面的话 最近在看"Computer Vision with Python" ...

  2. Jenkins+Maven+SVN快速搭建持续集成环境

    http://www.cnblogs.com/sunzhenchao/archive/2013/01/30/2883289.htmlhttp://blog.csdn.net/pein_zero/art ...

  3. 文件管理[Linux]

    文件系统 rootfs: 根文件系统 /boot 系统启动相关的文件,如内核.initrd.以及grub(bootloader) /dev 设备文件 块设备 随机访问 字符设备 线性访问 设备号 主设 ...

  4. 解决报错 ora-00704 ora-00604 ora-00942 启动不了数据库问题

    早上海南的同事打电话说他们的审计库连不上了启动也报错,问了下最近做了些什么操作,答复是之前添加了一次磁盘. 猜测是添加磁盘启动后/dev/sdx顺序出错,或者没有正常的关闭数据库导致数据库无法正常启动 ...

  5. F#之旅1 - Why use F#?为什么要用F#?

    原文地址:http://fsharpforfunandprofit.com/why-use-fsharp/ Why use F#?Why you should consider using F# fo ...

  6. sql字段属性

  7. find命令与cat命令区别

    在当前目录下查找 MEMBERINTERFACE 这个字符串的文件find . -name '*'|xargs grep "MEMBERINTERFACE"find / -name ...

  8. Ubuntu菜鸟入门(四)—— 搜狗输入法

    一 搜狗输入法安装 1  下载安装包:   http://pinyin.sogou.com/linux/ 2  安装安装包 (1)"GDebi",这是一个用于安装你自己手动下载包的 ...

  9. 安装openssl 扩展的时候出现Cannot find config.m4. Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the module的解决方法

    进入php源码包目录:cd /usr/local/php-5.6.25/ext/openssl 执行命令:  cp ./config0.m4 ./config.m4 即可

  10. log4j:WARN Please initialize the log4j system properly 问题解决

    log4j:WARN No appenders could be found for logger (com.netease.qa.testng.TestngRetry).log4j:WARN Ple ...