Android核心基础(ListView)

一、ListView的引入
  • ListView的特点
                         1、屏幕上可以展示几个条目,ListView就初始化几个,节省内存。
                         2、通过使用ConvertView对创建的视图对象进行复用,ListView始终保持创建的对象个数为:
                              屏幕显示的条目的个数+1
                         3、ListView自带ScrollView的功能,可以实现界面滚动。
                         4、ListView控件的设计遵循MVC设计模式:
                               mode数据模型(数据):要被显示到ListView上的数据集合
                               View视图(展示数据):ListView  
                               Controller 控制层(把数据展示在控件上):适配器Adapter
  • ListView的使用方式
  代码 :      
   1、在res/layout布局文件当中定义ListView
   
   
  1. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity">
  6. <ListView
  7. android:id="@+id/lv"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"/>
  10. </RelativeLayout>
   2、在src的MainActivity.java里面关心控件findViewById(R.id.listView)
     lv = (ListView) findViewById(R.id.lv); // 查找要关心的ListView控件
   3 、创建适配器:适配器继承 BaseAdapter : 
  
  
  1. privateclassMyAdapterextendsBaseAdapter{
  2. @Override
  3. publicint getCount(){// 控制ListView里面有多少个item
  4. return30;//通常这里返回的是一个查询结果集的记录数
  5. }
  6. @Override
  7. publicView getView(int position,View convertView,ViewGroup parent){// 得到每一个条目item,显示的视图内容
  8. TextView tv = null;

             if (null == convertView) {//如果缓存中没有数据则需要创建一个新的TextView

               

                tv = new TextView(MainActivity.this);

             }else{//如果缓存中有数据则直接强转即可

                tv = (TextView) convertView;

             }

             tv.setText("我是文本:" + position);

             tv.setTextSize(24);

             return tv;

    }
  9. @Override
  10. publicObject getItem(int position){//得到每一个条目item的对象(可以无视)
  11. returnnull;
  12. }
  13. @Override
  14. publiclong getItemId(int position){//得到每一个条目item的Id(可以无视)
  15. return0;
  16. }
  17. }
         4、设置适配器setAdapter(adapter)

        lv.setAdapter(new MyAdapter()); // 设置控制器 controller

         5、设置ListView列表项的点击事件 setOnitemClickLinstener()  重要参数position
         6、通知数据适配器刷新数据 adapter.notifyDataSetChanged()
   
   
  1. if(adapter ==null){//第一次显示数据
  2. adapter =newMyAdapter();
  3. lv.setAdapter(adapter);
  4. }else{//通知数据适配器更新数据,而不是new出来新的数据适配器
  5. adapter.notifyDataSetChanged();
  6. }
         7、用打气筒inflate  View.inflate() 创建View的视图
    
    
  1. View view =null;
  2. if(convertView ==null){// 把一个布局xml文件转化成view对象
  3. /**
  4. * 第一种方式:
  5. *
  6. * 系统控件View自带有inflate方法
  7. *
  8. */
  9. view =View.inflate(MainActivity.this, R.layout.item,null);
  10. /**
  11. * 第二种方式实现
  12. * 参考底层View.inflate()源码的实现:先通过LayoutInfalter 的静态方法from
  13. * 获取LayoutInflater 对象,然后调用inflate 方法
  14. */
  15. LayoutInflater layoutInflater =LayoutInflater.from(MainActivity.this);
  16. view = layoutInflater.inflate(R.layout.item,null);
  17. /**
  18. * 第三种方式实现:
  19. * 先通过上下文提供的getSystemService 方法获取LayoutInfater 对象
  20. * 然后调用inflate 方法
  21. */
  22. LayoutInflater layoutInflater2 =(LayoutInflater)
  23. getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  24. view = layoutInflater2.inflate(R.layout.item,null);
  25. }else{
  26. view = convertView;
  27. }
二、ListView的常用适配器
 除了经常使用到的BaseAdapter 外,系统还提供了几个已经实现好的适配器,都是继承至BaseAdapter
  • ArrayAdapter (数组适配器)
    
    
  1. lv =(ListView) findViewById(R.id.lv);
  2. String[] objects =newString[]{"Animation","App","content","Media","NFC","OS"};
  3. /**
  4. * 第一个参数是:上下文
  5. * 第二个参数是:布局文件的id,这里使用Android 系统提供的简单布局
  6. * 第三个参数是:要显示的数据,数组或者List 集合都行
  7. */
  8. lv.setAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item_1, objects));
  • SimpleAdapter (简单适配器)

SimpleAdapter 可以实现比ArrayAdapter 复杂一点的布局。

使用SimpleAdapter 的数据一般都是HashMap构成的List,List 的每一个对象对应ListView 的每一行。

HashMap 的每个键值数据映射到布局文件中对应id 的组件上。

因为系统没有对应的布局文件可用,我们可以自己定义一个布局文件。

      代码:

      
      
  1. lv =(ListView) findViewById(R.id.lv);
  2. List<Map<String,Object>> data =newArrayList<Map<String,Object>>();//准备数据
  3. Map<String,Object> map1 =newHashMap<String,Object>();
  4. map1.put("icon", R.drawable.ic_menu_preferences);
  5. map1.put("name","功能设置");
  6. data.add(map1);
  7. Map<String,Object> map2 =newHashMap<String,Object>();
  8. map2.put("icon", R.drawable.ic_menu_recent_history);
  9. map2.put("name","时钟设置");
  10. data.add(map2);
  11. Map<String,Object> map3 =newHashMap<String,Object>();
  12. map3.put("icon", R.drawable.ic_menu_refresh);
  13. map3.put("name","同步设置");
  14. data.add(map3);
  15. Map<String,Object> map4 =newHashMap<String,Object>();
  16. map4.put("icon", R.drawable.ic_menu_report_image);
  17. map4.put("name","图片设置");
  18. data.add(map4);
  19. /**
  20. * 第一个参数:上下文
  21. * 第二个参数:显示的数据
  22. * 第三个参数:布局文件的资源id
  23. * 第四个参数:Map 集合中key 的数组
  24. * 第五个参数:item 布局中ImageView控件的id 和 TextView 的控件的id
  25. */
  26. 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 -->进度条

  • 确定取消对话框
   
   
  1. 代码:
  2. //builder可以理解成一个构造器,构造对话框所需要的一些数据,最后由dialog来进行显示
  3. AlertDialog.Builder builder =newBuilder(this);
  4. builder.setTitle("警告:");
  5. builder.setMessage("若练此功,必先自宫,是否继续?");
  6. builder.setPositiveButton("确定自宫",newOnClickListener(){
  7. @Override
  8. publicvoid onClick(DialogInterface dialog,int which){
  9. Toast.makeText(MainActivity.this,"啊....",0).show();
  10. }
  11. });
  12. builder.setNegativeButton("想想再说",newOnClickListener(){
  13. @Override
  14. publicvoid onClick(DialogInterface dialog,int which){
  15. Toast.makeText(MainActivity.this,"如不自宫,一定不成功",0).show();
  16. }
  17. });
  18. AlertDialog dialog = builder.create();
  19. dialog.setCancelable(false);//设置其他空白区域点击是否可以关闭我们的dialog
  20. dialog.show();//注意一定要调用show否则显示不了对话框
  • 单选对话框
   
   
  1. //代码如下:
  2. AlertDialog.Builder builder =newBuilder(this);
  3. builder.setTitle("请选择您的性别:");
  4. finalString[] items ={"男","女","中性"};
  5. builder.setSingleChoiceItems(items,-1,newOnClickListener(){/**第一个参数为显示的条目数组,第二个参数为默认选中的条目,-1即不选中任何条目*/
  6. @Override
  7. publicvoid onClick(DialogInterface dialog,int which){
  8. Toast.makeText(MainActivity.this,"您的性别:"+ items[which],0).show();
  9. }
  10. });
  11. builder.setNegativeButton("取消选择",null);//点击事件如果设置为null则默认点击关闭对话框
  12. builder.show();
  • 对选对话框
   
   
  1. //代码如下:
  2. AlertDialog.Builder builder =newBuilder(this);
  3. builder.setTitle("请选择您爱吃的水果");
  4. finalString[] items =newString[]{"黄瓜","苹果","香蕉","菠萝菠萝蜜"};//条目的状态数组 true为选中 false为不选中
  5. finalboolean[] checkedItems =newboolean[]{true,true,false,false};
  6. builder.setMultiChoiceItems(items, checkedItems,newOnMultiChoiceClickListener(){
  7. @Override
  8. publicvoid onClick(DialogInterface dialog,int which,boolean isChecked){
  9. Toast.makeText(MainActivity.this,items[which]+ isChecked,0).show();
  10. checkedItems[which]= isChecked;
  11. }
  12. });
  13. builder.setNegativeButton("取消选择",null);
  14. builder.show();
  • 正在加载对话框
   
   
  1. //代码如下:
  2. finalProgressDialog pd =newProgressDialog(this);
  3. pd.setTitle("提醒");
  4. pd.setMessage("正在加载数据...请稍后");
  5. pd.show();
  6. newThread(){
  7. publicvoid run(){
  8. try{
  9. Thread.sleep(3000);
  10. }catch(InterruptedException e){
  11. e.printStackTrace();
  12. }
  13. pd.dismiss();//关闭对话框
  14. };
  15. }.start();
  • 进度条对话框
   
   
  1. //代码如下:
  2. finalProgressDialog pd =newProgressDialog(this);
  3. pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//进度条的风格为水平进度条
  4. pd.setMax(100);//进度条的最大值
  5. pd.setTitle("提醒");
  6. pd.setMessage("正在加载数据...请稍后");
  7. pd.show();
  8. newThread(){
  9. publicvoid run(){
  10. for(int i =0; i <=100; i++){
  11. try{
  12. Thread.sleep(300);
  13. }catch(InterruptedException e){
  14. e.printStackTrace();
  15. }
  16. pd.setProgress(i);//设置当前进度值
  17. }
  18. pd.dismiss();
  19. };
  20. }.start();
  • 自定义对话框
   
   
  1. View view =View.inflate(Context.R.layout.dialog,null)//布局填充器
  2. dialog.setView(view);//核心API
四、帧动画

帧动画:就是由一张一张的图片按照顺序和时间进行一帧一帧的播放。

帧动画使用的步骤:

1.  创建帧动画每帧需要的图片, 放到对应的 drawable-xxx 或drawable 目录中

2.  在drawable 目录下,创建帧动画 xml 文件,根节点选择 animation-list

   
   
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <animation-listxmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false">
  3. <item
  4. android:drawable="@drawable/logo1"
  5. android:duration="850">
  6. </item>
  7. <item
  8. android:drawable="@drawable/logo2"
  9. android:duration="850">
  10. </item>
  11. <item
  12. android:drawable="@drawable/logo3"
  13. android:duration="850">
  14. </item>
  15. </animation-list>

帧动画的自动执行:oneshot  如果为true,表示动画播放一次停止在最后一帧上,如果设置为false表示动画循环播放。

3. 设置为 View 的 Background 或者 ImageView 的 src,然后获取到控件的 AnimationDrawable 对象,通过 AnimationDrawable.start() 方法启动动画:

    
    
  1. ImageView iv =(ImageView) findViewById(R.id.iv);
  2. iv.setBackgroundResource(R.drawable.logo);
  3. AnimationDrawable anim =(AnimationDrawable) iv.getBackground();
  4. anim.start();//开始播放动画
五、国际化
  • 文字国际化

  在res文件下创建values--xx文件夹,在里面创建strings.xml文件,在里面写对应的语言

  • 图片国际化

     drawable-xxx里面的资源名字要起一样的,这样系统就能根据当前的语言自动去寻找对应的文件夹资源

六、样式和主题
  • 样式作用在单独的UI控件上
       在style文件里设置,如果想继承系统自带的主题或者样式,指定 parent=“需要继承的样式”;
       如果需要修改继承样式里的某一样,在自定义样式里面重写需要修改的属性即可。
     
     
  1. <stylename="text_content_style">
  2. <itemname="android:layout_width">match_parent</item>
  3. <itemname="android:layout_height">wrap_content</item>
  4. <itemname="android:textColor">#0000ff</item>
  5. <itemname="android:textSize">20sp</item>
  6. </style>
  7. <stylename="text_title_style"parent="@style/text_content_style">
  8. <itemname="android:textSize">25sp</item>
  9. </style>
  10. <!-- 该方式也可以指定父类为text_content_style,但是不建议 -->
  11. <stylename="text_content_style.sub">
  12. <itemname="android:textSize">28sp</item>
  13. </style>
这样做的目的是为了达到复用,代码的简洁,统一修改的便捷。   当一个布局界面有大量相同重复的布局属性参数时,就可以使用抽取 style 的方式来实现,比如:
     
     
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity">
  7. <TextView
  8. style="@style/text_title_style"
  9. android:text="@string/hello_world"/>
  10. <TextView
  11. style="@style/text_content_style"
  12. android:text="@string/hello_world"/>
  13. <TextView
  14. style="@style/text_content_style.sub"
  15. android:text="@string/hello_world"/>
  16. <TextView
  17. style="@style/text_content_style"
  18. android:text="@string/hello_world"/>
  19. <TextView
  20. style="@style/text_content_style"
  21. android:text="@string/hello_world"/>
  22. <TextView
  23. style="@style/text_content_style"
  24. android:text="@string/hello_world"/>
  25. </LinearLayout>
  • 主题作用在Activity或者application上

可以通过设置theme属性参数来修改整个应用程序或者单个界面的主题风格:

在清单文件里面配置 theme="@style:"

   
   
  1. <application
  2. android:allowBackup="true"
  3. android:icon="@drawable/ic_launcher"
  4. android:label="@string/app_name"
  5. android:theme="@style/AppTheme"
  6. >
指定style为AppTheme则整个应用程序的主题风格即为AppTheme的风格,当然也可以修改AppTheme的风格,将当前主题添加一个没有标题栏的风格:
    
    
  1. <!-- Application theme. -->
  2. <stylename="AppTheme"parent="AppBaseTheme">
  3. <itemname="android:windowNoTitle">true</item>
  4. <!-- All customizations that are NOT specific to a particular API-level can go here. -->
  5. </style>

或者自己定义一个theme:

     
     
  1. <stylename="my_app_theme">
  2. <itemname="android:windowNoTitle">true</item>
  3. <itemname="android:background">#440000ff</item>
  4. </style>

也可以在代码中设置主题:

在代码设置 setTheme(ResId) 此方法必须在setContentView之前调用

      
      
  1. publicclassMainActivityextendsActivity{
  2. @Override
  3. protectedvoid onCreate(Bundle savedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. setTheme(R.style.my_app_theme);
  6. setContentView(R.layout.activity_main);
  7. }
  8. }
七、数据库事务
       
       
  1. 自定义数据库帮助类 helper =new自定义数据库帮助类(上下文);
  2. SQLiteDatabase db = helper.getWritableDatabase();
  3. db.beginTransaction();// 开启事务
  4. try{
  5. db.execSQL(第一条要执行的SQL语句);
  6. db.execSQL(第二条要执行的SQL语句);
  7. db.setTransactionSuccessful();// 设置事务执行成功
  8. }finally{
  9. db.endTransaction();//结束事务
  10. }
  11. db.close();














  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值