专栏首页everhadAndroid零散

Android零散

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的调用产生一些差异。 //待续。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式:模板方法

    模板方法 使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。 代码解释 可以...

    用户1172465
  • App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gra...

    用户1172465
  • 安卓Task和Back Stack

    概述 一个Activity允许用户完成一些操作,甚至,Android中设计Activity为组件的形式,这样,多个Activity——甚至是其它App的Acti...

    用户1172465
  • TensorFlow实现神经网络入门篇

    如果你一直关注数据科学/机器学习,你就不能错过深度学习和神经网络的热潮。互联网公司正在寻找这方面的人,而且从竞赛到开源项目,都有巨额奖金。 如果你对深度学习所提...

    AI研习社
  • 前端同学经常忽视的一个 JavaScript 面试题

    这几天面试上几次碰上这道经典的题目,特地从头到尾来分析一次答案,这道题的经典之处在于它综合考察了面试者的JavaScript的综合能力,包含了变量定义提升、th...

    前端达人
  • UNIX网络编程学习指南--epoll函数

    epoll是select/poll的强化版,都是多路复用的函数,epoll有了很大的改进。 epoll的功能 1、支持监听大数目的socket描述符 一...

    用户1174963
  • Android Activity的生命周期

    通过上一节“Android系列之四:Android项目的目录结构”我们已经知道了什么是Activity,那么为什么我们创建一个Activity的导出类的时候为什...

    飞雪无情
  • [Android] 使用MediaProjection截屏

    Android5.0以上提供了MediaProjection,方便截屏录屏等功能。

    wOw
  • 【Flutter 专题】98 易忽略的【小而巧】的技术点汇总 (六)

    和尚在一些场景下需要根据父类布局大小不同展示不同的子类 Widget,例如和尚在适配大尺寸平板或横竖屏切换等场景时,此时需要用到 LayoutBui...

    阿策小和尚
  • 算法:时间复杂度+二分查找法(Java/Go/Python)实现

    曾几何时学好数据结构与算法是我们从事计算机相关工作的基本前提,然而现在很多程序员从事的工作都是在用高级程序设计语言(如Java)开发业务代码,久而久之,对于数据...

    用户5927304

扫码关注云+社区

领取腾讯云代金券