如何在ListView的视图里显示图片呢?很多初学者应该会被这个问题难倒,因为既不知道如何浏览图片,也不知道如何将图片嵌入到ListView中。这边就演示一个例子将图片嵌入到ListView中,并使用ContentProvider对ListView里的数据进行增删改查。
首先需要一个sqlite数据库文件,因为我们要使用ContentProvider跟它进行交互。我们先确定表结构,在这边我们创建一个有5列的表,表名是:contact,表结构如下图所示:
这边我们设置_id是Integer型,是主键,age是Integer型,其他则都是TEXT型。avatar是用来记录图片的Uri路径,我们不把图片的二进制信息记录到数据库中,因为读取数据库中的二进制肯定没有直接读取文件快。对应这个数据库表结构,创建一个类来记录列信息和访问它对应的Uri。
ContentMeta.java:
接着创建一个MainActivity.java,这个类主要用来将所有的Contact信息显示到ListView中,并添加Option Menu,让用户可以添加Contact,同时监听ListView的click事件,当用户点击Contact时可以对其进行编辑。
list_item_contact.xml
上面代码通过ContentProvider来获取ListView的数据源,所以当这个Activity在onCreate中调用managedQuery方法时,Android OS就会根据第一个参数Uri的格式来确定由哪个ContentProvider来处理这个查询请求,而到这里我们都还没编写任何ContentProvider,所以接下来要做的就是编写一个ContentProvider。这个ContentProvider的主要功能就是与Sqlite数据库进行交互,它就像是一个中间者,Activity通过Uri跟它进行交互,它通过判断Uri的格式(了解Uri),跟内部对应的Sqlite数据库表进行交互,这样分层的架构逐步降低复杂度,使代码更清晰,使维护代码变得更简单。
因为ContentProvider需要有一个内部的Sqlite数据库,所以我们在其内部编写一个私有静态内部类,用来操作内部的数据库。
上面的数据库helper类,需要引用到数据库的文件名、表名、版本信息。所以我们需要在ContentProvider的顶部先定义这些控制信息,同时配置UriMatcher让ContentProvider能使用它对Uri格式进行解析:
然后要做的就是重写ContentProvider中的增删改查方法,并在它的onCreate方法中创建一个数据库连接辅助对象,就是上面的DatabaseHelper类。
接下来我们首先写重写query方法,因为应用一进来就需要在ListView中显示Contact的信息,所以会第一个先调用query方法,在这个方法里,我们要根据Uri的格式来做判断,因为Uri要读取的可能是目录信息,也可能是单条信息:
目录信息: content://com.android777.listviewimage/contacts
单条信息: content://com.android777.listviewimage/contacts/1
然后根据不同的信息对数据库做不同的查询操作,query方法代码如下:
然后记得要在AndroidMenifest.xml文件中声明改Provider:
代码的运行效果如下:
当用户点击menu菜单,需要提供一个按钮让其可以添加Contact信息,这个在上面MainActivity代码中已经有了:
上面使用MenuInflater从资源文件中加载menu信息,然后当用户点击时创建一个Action是INSERT的Intent,设置对应的Activity类是:ContactActivity.class,然后跳转到新建页面。person_list_options_menu.xml文件的信息如下:
这时候点击事件也有了,添加Contact菜单的事件也有了,还缺少一个用来显示和添加Contact信息的界面:ContactActivity.java ,我们可以先创建它,然后先不用写任何东西。现在运行起来效果是:
接下来下一篇就要编写ContactActivity界面,然后进行新增和修改操作。