- ListView的特点:
- ListView的使用方式:
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
privateclassMyAdapterextendsBaseAdapter{
@Override
publicint getCount(){// 控制ListView里面有多少个item
return30;//通常这里返回的是一个查询结果集的记录数
}
@Override
publicView getView(int position,View convertView,ViewGroup parent){// 得到每一个条目item,显示的视图内容
TextView tv = null;
if (null == convertView) {//如果缓存中没有数据则需要创建一个新的TextView
tv = new TextView(MainActivity.this);
}else{//如果缓存中有数据则直接强转即可
tv = (TextView) convertView;
}
tv.setText("我是文本:" + position);
tv.setTextSize(24);
return tv;
}@Override
publicObject getItem(int position){//得到每一个条目item的对象(可以无视)
returnnull;
}
@Override
publiclong getItemId(int position){//得到每一个条目item的Id(可以无视)
return0;
}
}
lv.setAdapter(new MyAdapter()); // 设置控制器 controller
if(adapter ==null){//第一次显示数据
adapter =newMyAdapter();
lv.setAdapter(adapter);
}else{//通知数据适配器更新数据,而不是new出来新的数据适配器
adapter.notifyDataSetChanged();
}
View view =null;
if(convertView ==null){// 把一个布局xml文件转化成view对象
/**
* 第一种方式:
*
* 系统控件View自带有inflate方法
*
*/
view =View.inflate(MainActivity.this, R.layout.item,null);
/**
* 第二种方式实现
* 参考底层View.inflate()源码的实现:先通过LayoutInfalter 的静态方法from
* 获取LayoutInflater 对象,然后调用inflate 方法
*/
LayoutInflater layoutInflater =LayoutInflater.from(MainActivity.this);
view = layoutInflater.inflate(R.layout.item,null);
/**
* 第三种方式实现:
* 先通过上下文提供的getSystemService 方法获取LayoutInfater 对象
* 然后调用inflate 方法
*/
LayoutInflater layoutInflater2 =(LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater2.inflate(R.layout.item,null);
}else{
view = convertView;
}
- ArrayAdapter (数组适配器)
lv =(ListView) findViewById(R.id.lv);
String[] objects =newString[]{"Animation","App","content","Media","NFC","OS"};
/**
* 第一个参数是:上下文
* 第二个参数是:布局文件的id,这里使用Android 系统提供的简单布局
* 第三个参数是:要显示的数据,数组或者List 集合都行
*/
lv.setAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item_1, objects));
- SimpleAdapter (简单适配器)
SimpleAdapter 可以实现比ArrayAdapter 复杂一点的布局。
使用SimpleAdapter 的数据一般都是HashMap构成的List,List 的每一个对象对应ListView 的每一行。
HashMap 的每个键值数据映射到布局文件中对应id 的组件上。
因为系统没有对应的布局文件可用,我们可以自己定义一个布局文件。
代码:
lv =(ListView) findViewById(R.id.lv);
List<Map<String,Object>> data =newArrayList<Map<String,Object>>();//准备数据
Map<String,Object> map1 =newHashMap<String,Object>();
map1.put("icon", R.drawable.ic_menu_preferences);
map1.put("name","功能设置");
data.add(map1);
Map<String,Object> map2 =newHashMap<String,Object>();
map2.put("icon", R.drawable.ic_menu_recent_history);
map2.put("name","时钟设置");
data.add(map2);
Map<String,Object> map3 =newHashMap<String,Object>();
map3.put("icon", R.drawable.ic_menu_refresh);
map3.put("name","同步设置");
data.add(map3);
Map<String,Object> map4 =newHashMap<String,Object>();
map4.put("icon", R.drawable.ic_menu_report_image);
map4.put("name","图片设置");
data.add(map4);
/**
* 第一个参数:上下文
* 第二个参数:显示的数据
* 第三个参数:布局文件的资源id
* 第四个参数:Map 集合中key 的数组
* 第五个参数:item 布局中ImageView控件的id 和 TextView 的控件的id
*/
lv.setAdapter(newSimpleAdapter(this, data, R.layout.item,newString[]{"icon","name"},newint[]{R.id.iv,R.id.tv}));
- 对话框的初始化
AlertDialog.Builder builder = new Builder(当前Activity的上下文);
-
对话框设置属性
builder.setTitle(title);-->设置标题
builder.setMessage(msg);-->设置提醒信息
-
设置对话框按钮
builder.setPositiveButton(按钮文字,new DialogInterface.OnClickListener());-->最右边的按钮
builder.setNegativeButton(按钮文字,new DialogInterface.OnClickListener());-->最左边的按钮
builder.setNeutralButton(按钮文字,new DialogInterface.OnClickListener());-->中间的按钮
- 对话框显示
builder.show();
- 对话框样式
setSingleChoiceItems()-->单选
setMultiChoiceItems()-->多选
ProgressDialog -->进度条
- 确定取消对话框:
代码:
//builder可以理解成一个构造器,构造对话框所需要的一些数据,最后由dialog来进行显示
AlertDialog.Builder builder =newBuilder(this);
builder.setTitle("警告:");
builder.setMessage("若练此功,必先自宫,是否继续?");
builder.setPositiveButton("确定自宫",newOnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this,"啊....",0).show();
}
});
builder.setNegativeButton("想想再说",newOnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this,"如不自宫,一定不成功",0).show();
}
});
AlertDialog dialog = builder.create();
dialog.setCancelable(false);//设置其他空白区域点击是否可以关闭我们的dialog
dialog.show();//注意一定要调用show否则显示不了对话框
- 单选对话框
//代码如下:
AlertDialog.Builder builder =newBuilder(this);
builder.setTitle("请选择您的性别:");
finalString[] items ={"男","女","中性"};
builder.setSingleChoiceItems(items,-1,newOnClickListener(){
/**第一个参数为显示的条目数组,第二个参数为默认选中的条目,-1即不选中任何条目*/@Override
publicvoid onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this,"您的性别:"+ items[which],0).show();
}
});
builder.setNegativeButton("取消选择",null);
//点击事件如果设置为null则默认点击关闭对话框builder.show();
- 对选对话框
//代码如下:
AlertDialog.Builder builder =newBuilder(this);
builder.setTitle("请选择您爱吃的水果");
finalString[] items =newString[]{"黄瓜","苹果","香蕉","菠萝菠萝蜜"};
//条目的状态数组 true为选中 false为不选中finalboolean[] checkedItems =newboolean[]{true,true,false,false};
builder.setMultiChoiceItems(items, checkedItems,
newOnMultiChoiceClickListener(){@Override
publicvoid onClick(DialogInterface dialog,int which,
boolean isChecked){Toast.makeText(MainActivity.this,
items[which]+ isChecked,0).show();checkedItems[which]= isChecked;
}
});
builder.setNegativeButton("取消选择",null);
builder.show();
- 正在加载对话框
//代码如下:
finalProgressDialog pd =newProgressDialog(this);
pd.setTitle("提醒");
pd.setMessage("正在加载数据...请稍后");
pd.show();
newThread(){
publicvoid run(){
try{
Thread.sleep(3000);
}catch(InterruptedException e){
e.printStackTrace();
}
pd.dismiss();//关闭对话框
};
}.start();
- 进度条对话框
//代码如下:
finalProgressDialog pd =newProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//进度条的风格为水平进度条
pd.setMax(100);//进度条的最大值
pd.setTitle("提醒");
pd.setMessage("正在加载数据...请稍后");
pd.show();
newThread(){
publicvoid run(){
for(int i =0; i <=100; i++){
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
pd.setProgress(i);//设置当前进度值
}
pd.dismiss();
};
}.start();
- 自定义对话框
View view =View.inflate(Context.R.layout.dialog,null)//布局填充器
- dialog.setView(view);//核心API
帧动画:就是由一张一张的图片按照顺序和时间进行一帧一帧的播放。
帧动画使用的步骤:
1. 创建帧动画每帧需要的图片, 放到对应的 drawable-xxx 或drawable 目录中
2. 在drawable 目录下,创建帧动画 xml 文件,根节点选择 animation-list
<?xml version="1.0" encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false">
<item
android:drawable="@drawable/logo1"
android:duration="850">
</item>
<item
android:drawable="@drawable/logo2"
android:duration="850">
</item>
<item
android:drawable="@drawable/logo3"
android:duration="850">
</item>
</animation-list>
帧动画的自动执行:oneshot 如果为true,表示动画播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
3. 设置为 View 的 Background 或者 ImageView 的 src,然后获取到控件的 AnimationDrawable 对象,通过 AnimationDrawable.start() 方法启动动画:
ImageView iv =(ImageView) findViewById(R.id.iv);
iv.setBackgroundResource(R.drawable.logo);
AnimationDrawable anim =(AnimationDrawable) iv.getBackground();
anim.start();//开始播放动画
- 文字国际化
在res文件下创建values--xx文件夹,在里面创建strings.xml文件,在里面写对应的语言
- 图片国际化
drawable-xxx里面的资源名字要起一样的,这样系统就能根据当前的语言自动去寻找对应的文件夹资源
- 样式作用在单独的UI控件上
<stylename="text_content_style">
<itemname="android:layout_width">match_parent</item>
<itemname="android:layout_height">wrap_content</item>
<itemname="android:textColor">#0000ff</item>
<itemname="android:textSize">20sp</item>
</style>
<stylename="text_title_style"parent="@style/text_content_style">
<itemname="android:textSize">25sp</item>
</style>
<!-- 该方式也可以指定父类为text_content_style,但是不建议 -->
<stylename="text_content_style.sub">
<itemname="android:textSize">28sp</item>
</style>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
style="@style/text_title_style"
android:text="@string/hello_world"/>
<TextView
style="@style/text_content_style"
android:text="@string/hello_world"/>
<TextView
style="@style/text_content_style.sub"
android:text="@string/hello_world"/>
<TextView
style="@style/text_content_style"
android:text="@string/hello_world"/>
<TextView
style="@style/text_content_style"
android:text="@string/hello_world"/>
<TextView
style="@style/text_content_style"
android:text="@string/hello_world"/>
</LinearLayout>
- 主题作用在Activity或者application上
可以通过设置theme属性参数来修改整个应用程序或者单个界面的主题风格:
在清单文件里面配置 theme="@style:"
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<!-- Application theme. -->
<stylename="AppTheme"parent="AppBaseTheme">
<itemname="android:windowNoTitle">true</item>
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
或者自己定义一个theme:
<stylename="my_app_theme">
<itemname="android:windowNoTitle">true</item>
<itemname="android:background">#440000ff</item>
</style>
也可以在代码中设置主题:
在代码设置 setTheme(ResId) 此方法必须在setContentView之前调用
publicclassMainActivityextendsActivity{
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTheme(R.style.my_app_theme);
setContentView(R.layout.activity_main);
}
}
自定义数据库帮助类 helper =new自定义数据库帮助类(上下文);
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();// 开启事务
try{
db.execSQL(第一条要执行的SQL语句);
db.execSQL(第二条要执行的SQL语句);
db.setTransactionSuccessful();// 设置事务执行成功
}finally{
db.endTransaction();//结束事务
}
db.close();