zoukankan      html  css  js  c++  java
  • 安卓Android基础第三天——数据库,ListView

    1. 数据库介绍
      sqlite
      问:什么情况下使用数据库?
      答:有大量相似结构的数据需要存储的时候
    2. 数据库的创建
      定义一个类继承SqliteOpenHelper
      context:上下文
      name:数据库名字,如"test.db"
      factory:目的创建cursor对象,游标(默认为null)
      version:数据库版本,>=1
      super(context,name,null,version)
    3. 数据库的onCreate方法和onUpgrade方法
      1. 使用SQLite Expert Profession这个工具可以打开我们创建的数据库
      2. 需要提前安装这个数据库工具
    4. 使用sql语句对数据库进行增删改查
      1. 缺点
        1. Sql语句容易写错
        2. 执行sql语句没有返回值不容易判断
      2. 优点
        1. 容易进行多表查询
    5. 使用谷歌封装好的api对数据进行增删改查
      1. 优点
        1. 写法简单,不需要复杂的sql语句,不易写错
        2. 有返回值,方便开发
      2. 缺点:
        如果有多张表,使用谷歌api不容易进行查询
    6. Android中数据库的事务的介绍
      1. 事务:执行一段逻辑,要么同时成功,要么同时失败。--银行转账的案例
      2. 事务步骤:
        1. db.beginTransition();
        2. db.setTransitionSuccessful();
        3. db.endTransition();
    7. listview
      1. ListView作用:Android系统中显示列表的控件
      2. 每一个ListView都可以包含很多列表项
        ListView的显示与缓存机制

        Recycler是View缓冲池
        需要才显示,显示完被回收到缓存中
      3. 数据适配器
        作用:把复杂的数据(数组,链表,数据库,集合等)填充到指定视图界面上,降低程序耦合性,容易扩展
        1. ArrayAdapter(数组适配器):用于绑定格式单一的数据
          数据源:可以是集合或数组
        2. SimpleAdapter(简单适配器)
          数据源:只能是特定泛型的集合
        3. 数据适配器是数据源和视图界面的桥梁
        4. 实现过程:新建适配器à添加数据源到适配器à视图加载适配器
      4. 监听器
        1. 作用:Android提供了很多事件监听器,监听器主要为了去响应某个动作。
        2. OnItemClickListener:可以处理视图中单个条目的点击事件
        3. OnScrollListener:检测滚动的变化,可以用于视图在滚动中加载数据
        4. 监听器是程序和用户(或系统)交互的桥梁

      下面是数组适配器和简单适配器的用例:

      MainActivity.java:

       1 public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AbsListView.OnScrollListener {
       2 
       3     private ArrayAdapter<String> arrayAdapter;
       4     private SimpleAdapter simpleAdapter;
       5     private ListView listView;
       6     private List<Map<String, Object>> dataList;
       7 
       8     @Override
       9     protected void onCreate(Bundle savedInstanceState) {
      10         super.onCreate(savedInstanceState);
      11         setContentView(R.layout.activity_main);
      12 
      13         listView = findViewById(R.id.listView);
      14 /*数组适配器步骤:
      15         String[] arr_data = {"数据1", "数据2", "数据3", "数据4", "数据5", "数据6", "数据7", "数据8", "数据9", "数据10"};
      16         //1、新建一个数据适配器
      17         //ArrayAdapter<String>(上下文,当前listView加载的每一个列表项所对应的布局文件,数据源)
      18         //2、加载数据
      19         arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, arr_data);
      20         //3、视图加载适配器
      21         listView.setAdapter(arrayAdapter);
      22 */
      23 
      24         /**
      25          *simpleAdapter = new SimpleAdapter(context,data,reaource,from,to);
      26          *context:上下文
      27          * data: 数据源(List<? extends Map<String,?>>data) 一个Map所  组成的List集合
      28          *       每一个Map都会对应ListView列表的一行
      29          *       每一个Map中的键必须包含所有在from所制定的键
      30          * resource:列表项布局的ID
      31          * from:Map中的键名
      32          * to:绑定数据视图中的ID,与from成对应的关系
      33          */
      34         dataList = new ArrayList<Map<String, Object>>();
      35         simpleAdapter = new SimpleAdapter(getApplicationContext(), getData(), R.layout.item, new String[]{"pic", "simpleText"}, new int[]{R.id.pic, R.id.simpleText});
      36 
      37         //3、视图加载适配器
      38         listView.setAdapter(simpleAdapter);
      39         listView.setOnItemClickListener(this);
      40         listView.setOnScrollListener(this);
      41     }
      42 
      43     private List<Map<String, Object>> getData() {
      44         for (int i = 0; i < 20; i++) {
      45             Map<String, Object> map = new HashMap<String, Object>();
      46             map.put("pic", R.drawable.ic_launcher_foreground);
      47             map.put("simpleText", "lalala" + i);
      48             dataList.add(map);
      49 
      50         }
      51 
      52         return dataList;
      53     }
      54 
      55     @Override
      56     public void onScrollStateChanged(AbsListView view, int scrollState) {
      57         switch (scrollState) {
      58             case SCROLL_STATE_FLING:
      59                 Log.i("Main", "用户在手指离开屏幕之前,由于用力滑动了一下,视图仍以靠惯性继续滑动");
      60                 Map<String,Object> map = new HashMap<String,Object>();
      61                 map.put("pic",R.drawable.ic_launcher_foreground);
      62                 map.put("simpleText","增加项");
      63                 dataList.add(map);
      64                 simpleAdapter.notifyDataSetChanged();
      65                 break;
      66             case SCROLL_STATE_IDLE:
      67                 Log.i("Main", "试图以停止滑动");
      68                 break;
      69             case SCROLL_STATE_TOUCH_SCROLL:
      70                 Log.i("Main", "手指没有离开屏幕,视图正在滑动");
      71                 break;
      72 
      73         }
      74     }
      75 
      76     @Override
      77     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
      78 
      79     }
      80 
      81     @Override
      82     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      83         String text = listView.getItemAtPosition(position) + "";
      84         Toast.makeText(getApplicationContext(), "position:" + position + "tetx:" + text, Toast.LENGTH_SHORT).show();
      85     }
      86 }
      View Code


      Activity_main.xml:

       1 <?xml version="1.0" encoding="utf-8"?>
       2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
       3     xmlns:tools="http://schemas.android.com/tools"
       4     android:layout_width="match_parent"
       5     android:layout_height="match_parent"
       6     tools:context=".MainActivity">
       7 
       8     <ListView
       9         android:id="@+id/listView"
      10         android:layout_width="match_parent"
      11         android:layout_height="wrap_content">
      12     </ListView>
      13 
      14 </android.support.constraint.ConstraintLayout>
      View Code


      Item.xml:

       1 <?xml version="1.0" encoding="utf-8"?>
       2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       3 
       4     android:layout_width="match_parent"
       5     android:layout_height="wrap_content"
       6     android:orientation="horizontal">
       7     <ImageView
       8         android:id="@+id/pic"
       9         android:layout_width="wrap_content"
      10         android:layout_height="wrap_content"
      11         android:layout_marginLeft="15dp"
      12         android:src="@drawable/ic_launcher_foreground"/>
      13     <TextView
      14         android:id="@+id/simpleText"
      15         android:layout_width="wrap_content"
      16         android:layout_height="wrap_content"
      17         android:textSize="20sp"
      18         android:text="demo"/>
      19 
      20 </LinearLayout>
      View Code
    • 最通用的数据适配器——BaseAdapter,BaseAdapter基本结构
      1. public int getCount():适配器中数据集中数据的个数
      2. public Object getItem(int position):回去数据集中与指定索引对应的数据项
      3. public long getItemId(int position):回去制定对应的ID
      4. public View getView(int position, View convertView, ViewGroup parent):获取每一个Item的显示内容

      下面是BaseAdapter用例:
      item.xml:

       1 <?xml version="1.0" encoding="utf-8"?>
       2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       3     android:layout_width="match_parent"
       4     android:layout_height="wrap_content">
       5     <ImageView
       6         android:id="@+id/item_image"
       7         android:layout_width="60dp"
       8         android:layout_height="60dp" />
       9     <TextView
      10         android:id="@+id/item_title"
      11     android:layout_width="match_parent"
      12     android:layout_height="30dp"
      13     android:layout_toEndOf="@+id/item_image"
      14     android:text="Title"
      15     android:gravity="center"
      16     android:textSize="25sp"/>
      17     <TextView
      18         android:id="@+id/item_content"
      19         android:layout_width="match_parent"
      20         android:layout_height="30dp"
      21         android:layout_toEndOf="@+id/item_image"
      22         android:text="Content"
      23         android:gravity="center_vertical"
      24         android:textSize="25sp"/>
      25 
      26 </RelativeLayout>
      View Code

      ItemBean.java:

       1 package com.lgqchinese.baseadaptertext;
       2 
       3 public class ItemBean {
       4     public int ImageImageResid;
       5     public String ItemTitle;
       6     public String ItemContent;
       7 
       8     public ItemBean(int imageImageResid, String itemTitle, String itemContent) {
       9         ImageImageResid = imageImageResid;
      10         ItemTitle = itemTitle;
      11         ItemContent = itemContent;
      12     }
      13 }
      View Code

      Myadapter.java:

        1 package com.lgqchinese.baseadaptertext;
        2 
        3 import android.content.Context;
        4 import android.view.LayoutInflater;
        5 import android.view.View;
        6 import android.view.ViewGroup;
        7 import android.widget.BaseAdapter;
        8 import android.widget.ImageView;
        9 import android.widget.TextView;
       10 
       11 import java.util.List;
       12 
       13 public class MyAdapter extends BaseAdapter {
       14     private List<ItemBean> myList;
       15     private LayoutInflater myInflater;
       16 
       17     public MyAdapter(Context context, List<ItemBean> list) {
       18         myList = list;
       19         //context:要使用当前的Adapter的界面对象
       20         //myInflater:布局装载器对象
       21         myInflater = LayoutInflater.from(context);
       22     }
       23 
       24     @Override
       25     //返回ListView需要显示的数据数量
       26     public int getCount() {
       27         return myList.size();
       28     }
       29 
       30     //返回指定索引对应的数据项
       31     @Override
       32     public Object getItem(int position) {
       33         return myList.get(position);
       34     }
       35 
       36     //返回对应的索引项
       37     @Override
       38     public long getItemId(int position) {
       39         return position;
       40     }
       41 
       42     //返回每一项的显示内容
       43     @Override
       44     public View getView(int position, View convertView, ViewGroup parent) {
       45         /*请勿模仿!!!!!!!!!!!!!!!
       46         //有病,没有考虑缓存机制,造成对资源的极大浪费,效率极其低下
       47         View view = myInflater.inflate(R.layout.item,null);
       48         ImageView imageView = view.findViewById(R.id.item_image);
       49         TextView tv_title = view.findViewById(R.id.item_title);
       50         TextView tv_content = view.findViewById(R.id.item_content);
       51         ItemBean bean = myList.get(position);
       52         imageView.setImageResource(myList.get(position).ImageImageResid);
       53         tv_title.setText(bean.ItemTitle);
       54         tv_content.setText(bean.ItemContent);
       55         return view;
       56         !!!!!!!!!!!!!!!!!!!!*/
       57         //普通式,入门
       58         /*if (convertView == null) {
       59             convertView = myInflater.inflate(R.layout.item, null);
       60         }
       61         ImageView imageView = convertView.findViewById(R.id.item_image);
       62         TextView tv_title = convertView.findViewById(R.id.item_title);
       63         TextView tv_content = convertView.findViewById(R.id.item_content);
       64         ItemBean bean = myList.get(position);
       65         imageView.setImageResource(bean.ImageImageResid);
       66         tv_title.setText(bean.ItemTitle);
       67         tv_content.setText(bean.ItemContent);
       68         return convertView;*/
       69         //普通式
       70 
       71         //优化式
       72 
       73         ViewHolder viewHolder;
       74         if (convertView==null){
       75             viewHolder=new ViewHolder();
       76             convertView = myInflater.inflate(R.layout.item, null);
       77             viewHolder.imageView=convertView.findViewById(R.id.item_image);
       78             viewHolder.tv_title= convertView.findViewById(R.id.item_title);
       79             viewHolder.tv_content=convertView.findViewById(R.id.item_content);
       80             convertView.setTag(viewHolder);
       81 
       82 
       83         }else {
       84             viewHolder=(ViewHolder) convertView.getTag();
       85         }
       86         ItemBean bean = myList.get(position);
       87         viewHolder.imageView.setImageResource(bean.ImageImageResid);
       88         viewHolder.tv_title.setText(bean.ItemTitle);
       89         viewHolder.tv_content.setText(bean.ItemContent);
       90         return convertView;
       91 
       92         // 优化式
       93 
       94     }
       95 
       96     class ViewHolder {
       97         public ImageView imageView;
       98         public TextView tv_title;
       99         public TextView tv_content;
      100     }
      101 }

      activity_main.xml:

       1 <?xml version="1.0" encoding="utf-8"?>
       2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
       3     xmlns:app="http://schemas.android.com/apk/res-auto"
       4     xmlns:tools="http://schemas.android.com/tools"
       5     android:layout_width="match_parent"
       6     android:layout_height="match_parent"
       7     tools:context=".MainActivity">
       8 
       9     <ListView
      10         android:id="@+id/list_main"
      11         android:layout_width="match_parent"
      12         android:layout_height="match_parent"></ListView>
      13 
      14 </android.support.constraint.ConstraintLayout>
      View Code

      MainActivity.java:

       1 package com.lgqchinese.baseadaptertext;
       2 
       3 import android.support.v7.app.AppCompatActivity;
       4 import android.os.Bundle;
       5 import android.widget.ListView;
       6 
       7 import java.util.ArrayList;
       8 import java.util.List;
       9 
      10 public class MainActivity extends AppCompatActivity {
      11 
      12     @Override
      13     protected void onCreate(Bundle savedInstanceState) {
      14         super.onCreate(savedInstanceState);
      15         setContentView(R.layout.activity_main);
      16 
      17         List<ItemBean> itemBeanList = new ArrayList<>();
      18         for (int i = 0;i<20;i++){
      19             itemBeanList.add(new ItemBean(
      20                     R.drawable.ic_launcher_foreground,
      21                     "我是标题"+i,
      22                     "我是内容"+i
      23             ));
      24         }
      25         ListView listView = findViewById(R.id.list_main);
      26         listView.setAdapter(new MyAdapter(this,itemBeanList));
      27     }
      28 }
      View Code
        1. ListView显示数据的原理
          mvc:
          1. Javaweb
            m:mode,数据
            v:view视图,用jsp
            c:controller,用servlet
          2. Android
            m:mode数据(javabean)
            v:view,用ListView
            c:adaper
        2. 使用ListView高的时候使用填充父窗体(match…)
    昔日我曾苍老,如今风华正茂(ง •̀_•́)ง
  • 相关阅读:
    c# 让接口实现方法
    码支付 C#
    WebApi 接口返回值类型详解
    阿里云RDS数据库sql server 导入数据并添加作业小结
    IIS 图片 JS CSS 500错误
    XML字符串反序列化为实体
    找不到请求的 .Net Framework Data Provider
    JS通过ClassName禁止DIV点击
    WebRequest请求被中止: 未能创建 SSL/TLS 安全通道
    NetMQ 消息队列
  • 原文地址:https://www.cnblogs.com/lgqrlchinese/p/9920821.html
Copyright © 2011-2022 走看看