一步步实现一个城市选择器Word格式文档下载.docx
- 文档编号:16307389
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:27
- 大小:261.48KB
一步步实现一个城市选择器Word格式文档下载.docx
《一步步实现一个城市选择器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《一步步实现一个城市选择器Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
colorPrimaryDark"
@color/colorPrimaryDark<
colorAccent"
@color/colorAccent<
/style>
android:
theme="
@style/AppTheme"
这个默认的主题是带有actionbar的,如果我们要去掉这个actionbar,首先需要把DarkActionBar改为NoActionBar,因为使用AppCompatActivity的时候,Activity必须使用Theme.AppCompat主题及其子主题,所以我们的自定义的HD_NoActionBar样式必须继承这个主题:
Theme.AppCompat.Light.NoActionBar"
HD_NoActionBar"
windowNoTitle"
true<
windowActionBar"
false<
然后引用这个style:
@style/AppTheme.NoActionBar"
接下来写我们的头布局title_view.xml:
LinearLayoutxmlns:
android="
xmlns:
tools="
layout_width="
match_parent"
layout_height="
wrap_content"
orientation="
vertical"
RelativeLayout
android:
?
attr/actionBarSize"
background="
@color/light_blue"
ImageView
id="
@+id/back"
style="
@style/Widget.AppCompat.ActionButton"
paddingLeft="
16dp"
paddingRight="
scaleType="
center"
src="
@mipmap/ic_back"
tools:
ignore="
ContentDescription"
/>
TextView
layout_centerInParent="
true"
text="
@string/select_city"
textSize="
20sp"
textColor="
@color/white"
/RelativeLayout>
View
1dp"
/>
布局返回按钮用一个ImageView,title用一个Textview。
然后在我们的主布局里使用标签引入头布局:
@+id/activity_main"
includelayout="
@layout/title_view"
现在的效果是这样的:
搜索框布局searchview
search_view/xml:
36dp"
layout_marginBottom="
8dp"
layout_marginLeft="
layout_marginRight="
layout_marginTop="
gravity="
center_vertical"
@drawable/search_box_bg"
@mipmap/ic_search"
EditText
@+id/et_search"
layout_weight="
1"
0dp"
@null"
hint="
@string/hint_search_box"
textColorHint="
@color/deep_blue"
inputType="
text"
singleLine="
14sp"
RtlHardcoded"
@+id/iv_search_clear"
@mipmap/ic_search_clear"
visibility="
gone"
然后在主布局里引入这个布局:
@layout/search_view"
搜索框的布局也非常简单,就不说明了。
现在的效果:
城市列表
接下来的定位城市、热门城市、以及所有城市的列表我们使用一个Listview搞定,让Listview加载三种不同的布局来展示。
定位城市和所有城市列表好说,这个热门城市的UI该怎么做呢?
我们准备使用gridview来做,在listview里嵌套gridview会遇到gridview只能显示一行的问题,我们先重现这个问题,然后再分析怎么解决。
listview需要一个adapter适配器,adapter需要一个数据源,我们的数据源存放在一个db数据库里,所以我们要构建一个数据库操作类,从数据库中取出这些城市然后展示出来。
这一段的代码比较多,前方高能预警(^__^)
我们把要做的事情按步骤划分:
1、导入数据库文件
2、构建City对象,用户存储城市信息
3、创建DBManager用来操作数据库,将查询到的数据传递给adapter
4、编写定位城市、热门城市、所有城市三种不同的item布局
5、编写adapter,在adapter里加载三种item布局
6、编写gridview热门城市的item布局
7、实现gridview的adapter
1、建立assets文件,并把db文件放在assets目录下:
2、City对象
City.Java:
publicclassCity{
privateStringname;
privateStringpinyin;
publicCity(){}
publicCity(Stringname,Stringpinyin){
this.name=name;
this.pinyin=pinyin;
}
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
publicStringgetPinyin(){
returnpinyin;
publicvoidsetPinyin(Stringpinyin){
数据库操作类:
DBManager.java:
publicclassDBManager{
privatestaticfinalStringASSETS_NAME="
china_cities.db"
;
privatestaticfinalStringDB_NAME="
privatestaticfinalStringTABLE_NAME="
city"
privatestaticfinalStringNAME="
name"
privatestaticfinalStringPINYIN="
pinyin"
privatestaticfinalintBUFFER_SIZE=1024;
privateStringDB_PATH;
privateContextmContext;
//初始化
publicDBManager(Contextcontext){
this.mContext=context;
DB_PATH=File.separator+"
data"
+Environment.getDataDirectory().getAbsolutePath()+File.separator
+context.getPackageName()+File.separator+"
databases"
+File.separator;
//保存数据库到本地
@SuppressWarnings("
ResultOfMethodCallIgnored"
)
publicvoidcopyDBFile(){
Filedir=newFile(DB_PATH);
if(!
dir.exists()){
dir.mkdirs();
}
FiledbFile=newFile(DB_PATH+DB_NAME);
dbFile.exists()){
InputStreamis;
OutputStreamos;
try{
is=mContext.getResources().getAssets().open(ASSETS_NAME);
os=newFileOutputStream(dbFile);
byte[]buffer=newbyte[BUFFER_SIZE];
intlength;
while((length=is.read(buffer,0,buffer.length))>
0){
os.write(buffer,0,length);
os.flush();
os.close();
is.close();
}catch(IOExceptione){
e.printStackTrace();
/**
*读取所有城市
*@return
*/
publicList<
City>
getAllCities(){
SQLiteDatabasedb=SQLiteDatabase.openOrCreateDatabase(DB_PATH+DB_NAME,null);
Cursorcursor=db.rawQuery("
select*from"
+TABLE_NAME,null);
List<
result=newArrayList<
();
Citycity;
while(cursor.moveToNext()){
Stringname=cursor.getString(cursor.getColumnIndex(NAME));
Stringpinyin=cursor.getString(cursor.getColumnIndex(PINYIN));
city=newCity(name,pinyin);
result.add(city);
cursor.close();
db.close();
Collections.sort(result,newCityComparator());
returnresult;
*通过名字或者拼音搜索
*@paramkeyword
searchCity(finalStringkeyword){
+TABLE_NAME+"
wherenamelike\"
%"
+keyword
+"
%\"
orpinyinlike\"
+keyword+"
"
null);
*a-z排序
privateclassCityComparatorimplementsComparator<
{
@Override
publicintcompare(Citylhs,Cityrhs){
Stringa=lhs.getPinyin().substring(0,1);
Stringb=rhs.getPinyin().substring(0,1);
returnpareTo(b);
这个类使用SQLiteDatabase来管理数据库,同事写了一个排序类CityComparator用来对城市按照首字母进行排序
定位城市的布局:
view_locate_city.xml:
paddingBottom="
tools:
@style/LetterIndexTextViewStyle"
@string/located_city"
LinearLayout
@color/content_bg"
@+id/layout_locate"
40dp"
minWidth="
96dp"
clickable="
@drawable/overlay_bg"
@mipmap/ic_locate"
@+id/tv_located_city"
@string/locating"
16sp"
/LinearLayout>
然后是所有城市的布局:
@+id/tv_item_city_listview_letter"
18sp"
false"
@+id/tv_item
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一步步 实现 一个 城市 选择器