写这个例子的目的是供同事和开发Android的朋友学习借鉴。

这个版本不是凭空冒出来的,就像爱因斯坦做手工的故事(不知道的见这里)一样,还有更丑的“小凳子”,它们是:

  • 简单使用SimpleCursorAdapter
  • 在视图显示中使用Style
  • 在视图显示中使用Theme
  • android 1.6下使用Loader示例

参考它们可以了解版本的演进过程。可能降低学习曲线。

这个版本的首页:

点击条目,会弹出带图片的详细信息界面:

这里的图片是从维基百科直接下载的,并会缓存在本地。

另外,就是对横竖屏使用了不同的布局:

下面介绍一下实现的要点。

异步延时加载的处理

以前我都是自己写异步加载,比如用Java concurrent编写异步加载图片功能android异步加载ListView中的图片。其实android自己有个AsyncTask,可以方便的做这个事情。这次尝试使用了一下。

我目前的基本理解是AsyncTask简化了异步开发。

因为如果自己写,需要创建线程执行后台操作,比如下载图片文件,然后还是要通过handler通知ui线程将图片文件显示到界面上。

AsyncTask提供了需要实现的方法,一些方法AsyncTask会创建线程执行,比如doInBackground,而onPostExecute方法,AsyncTask会自行调用handler通知ui线程执行。

这部分代码见DetailViewActivity的内部类:

private class ShowImageTask extends AsyncTask<String, Void, Void> {

private String fileName;

@Override
    protected Void doInBackground(String… params) {
        fileName = params[1] + ".jpg";

File cacheFile = new File(getCacheDir(), fileName);
        if (!cacheFile.exists()) {
            //创建临时文件,用于下载图片使用
            File tempFile = new File(getCacheDir(), "tmp");
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(params[0]);
            try {
                HttpResponse response = client.execute(get);
                FileOutputStream outputStream = new FileOutputStream(
                        tempFile);
                InputStream inputStream = response.getEntity().getContent();
                for (int i = inputStream.read(); i != -1; i = inputStream
                        .read()) {
                    outputStream.write(i);
                }
                inputStream.close();
                outputStream.close();
               
                /**
                 * 改名临时文件,改为对应河流id的jpg文件
                 * 这样做是为了防止图片下载不全的问题
                 */
                tempFile.renameTo(cacheFile);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

return null;
    }

@Override
    protected void onPostExecute(Void result) {
        try {
            imageView.setImageDrawable(Drawable.createFromStream(
                    new FileInputStream(new File(getCacheDir(), fileName)),
                    "river.jpg"));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        imageLoadProgressBar.setVisibility(View.GONE);
    }

这里还需要注意的是,使用了httpclient api来下载图片,这部分如果不明白,可参见更简单的示例android编写访问http的代码。只不过这里是使字节流。

下载的图片放在哪里?这里没有选择放在sd卡这样的外存中,而是放在内存里。内存可存储在两个位置:

  • 存放在应用的files目录下,不过不能直接操作目录,只能通过openFileOutput()操作文件流,当不存在的时候自动创建
  • 存放在应用的cache目录下,可操作文件目录,通过getCacheDir()方法可获取目录File对象

在这里使用cache目录的方式,因为要操作文件并且涉及到文件改名等。

有关Content Provider和数据库

示例使用了Content Provider,而且是:

sqlite+Content Provider+CursorAdapter+Loader+ListView

示例中详细界面是Activity,设置了dialog的theme,看上去像对话框。这样做的考虑是结构简单,两个Activity是通过intent来松散耦合的。在intent中传递的是river的id。

这样,content provider需要能处理对集合的查询和对指定id的查询:

switch (uriMatcher.match(uri)) {//判断是访问river集合还是指定id访问单条记录
case ITEMS:
    cursor = database.query("rivers", projection, selection,
            selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
case ITEM:
    cursor = database.query("rivers", projection, _ID + "="
            + uri.getPathSegments().get(1), selectionArgs, null, null,
            sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
default:
    throw new IllegalArgumentException("unknown uri: " + uri);
}

横竖屏的处理

这个处理其实很简单。基本思路是针对横竖屏有不同的布局文件,android会在配置变化自动识别并加载对应文件。

如图所示,可知目录的命名方法。

源代码见:

http://easymorse.googlecode.com/svn/tags/CustomListViewDemo-0.5.1/

中国水系Android第一个版本相关推荐

  1. 中国市场Android终端App兼容性质量报告

    由于Google的开放策略,越来越多的终端厂商甚至互联网企业加入到手机终端商的领域,迅速加剧了Android移动终端的碎片化,但随之而来基于Android的移动App产品因为智能终端不能正常安装.意外 ...

  2. 中国医疗AI第一股首位投资人:AI不再高深,正在回归商业本质

    杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 中国医疗AI第一股,已经敲钟落定! 2021年11月5日,鹰瞳科技Airdoc正式在港交所上市,开盘价67.6港元,当日市值超过72亿港元. ...

  3. .net程序员转战android第一篇---环境部署

    对于.net开发人员去写java,可谓说是见山是山, 因为太多的相同; 最近段时间因工作因素,将项目中部分功能需要移植到android平台上,经过半个月的煎熬,终于搞完了. 文章中将直观记录我做项目中 ...

  4. 如何做一个新产品的第一个版本:关于MVP和上线时间的权衡

    为什么第一个版本要是MVP?为啥要梳理MVP?书里(<精益创业>)告诉你,你需要用一个最小可行性的模型去验证需求.用最小的代价去验证用户是否买账,就算是验证出来是伪需求,也方便及时调整方向 ...

  5. android 主要哪些版本,你用过的最早的安卓版本是哪个?带你见识最早的安卓系统!...

    原标题:你用过的最早的安卓版本是哪个?带你见识最早的安卓系统! 随着Android版本更新的迭代,许多人现在使用Android 7.1版甚至8.0版.但你还记得你接触过多少最早的安卓版本吗?对于许多经 ...

  6. android 系统(143)---Android实现App版本自动更新

    Android实现App版本自动更新 现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器 ...

  7. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  8. 说说android下TV版本UC浏览器模拟鼠标的实现

    说说android下TV版本UC浏览器模拟鼠标的实现      无意中下载了一个TV版本的UC浏览器安装到机顶盒上,顺便体验了一把.感觉吗还行,原先以为UC浏览器会针对Android下TV的遥控器操作 ...

  9. Android系统和版本介绍

    Android系统的发展 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.Android操作系统最 ...

  10. 切图iOS和android区别,用sketch也要画iOS和android两套吗|Sketch如何用一套设计稿做iOS和Android两个版本 - PS下...

    很多Sketch 新手刚进入接触UI设计的时候,不知道如何用一套设计稿来处理IOP和安卓两个系统的图,那么如何用一套设计稿较快速地做 iOS 和 Android 两个版本 app?是不是要做两套呢?然 ...

最新文章

  1. API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。
  2. PMCAFF|产品经理必须懂得的五大心理学分支
  3. AI理论知识整理(1)-数列(1)
  4. python string 方法,python字符串的方法与操作大全
  5. oracle优质图书,经典Oracle图书推荐(之四)_oracle
  6. django model Meta选项
  7. Java笔记-2种发送接收表单的数据
  8. mysql 新增返回主键自增id_详解mysql插入数据后返回自增ID的七种方法
  9. iOS版本更新与集成百度地图
  10. MATLAB如何调用百度云文字识别API
  11. 51智联等已成“厕所”,猎聘网建“会所”求突破
  12. 怎么去掉WIN7窗口文本框中淡绿色的底色
  13. 在单面打印机上使用WPS实现手工双面打印
  14. 虚拟服务器黑屏怎么办,解决VMware 虚拟机开机黑屏的问题
  15. 2019智能手表推荐_2020年买什么智能手表合适?
  16. 永信至诚助“海南省首届网络安全大赛”决赛圆满收官
  17. 移植Linux 3.4.2内核到JZ2440开发板(超精讲)
  18. python api讲解_集合api讲解_Python C编程视频课程_Python视频-51CTO学院
  19. 强大的刻盘软件 Ashampoo Burning Studio 9.20 中文版 + 注册码下载
  20. 详解新网银木马清除技巧

热门文章

  1. 谷粒商城学习笔记(一)
  2. matlab机器学习基础
  3. [转]: GB2312-80区位编码表
  4. 凤凰项目:一个IT运维的传奇故事
  5. eclipse 输入光标由于误操作变成小黑块如何恢复
  6. php渐变闪动字体代码,《天龙八部2》33种超好看彩色闪字渐变代码分享
  7. python将json转化为数组_将JSON转换为数组?
  8. matlab 均匀设计编程,均匀设计均匀设计表--方开泰.doc
  9. matlab 透镜设计,一种用于均匀照明的LED透镜设计方法
  10. solaris系统修改密码步骤