zoukankan      html  css  js  c++  java
  • 把数据库内容显示在listview上

    数据库操作很简单,但用户想看见的是数据库里的内容,那么让数据库内容显示在屏幕上呢,下面做个简单演示,百变不离其中,先看步骤:

    把数据库的数据显示至屏幕
    1. 任意插入一些数据
     定义Javabean:Person.java来封装name, phone, money 并设置get ,set , tostring方法


    然后 读取数据库的所有数据:

    Cursor cs = db.query("person", null, null, null, null, null, null);
    while(cs.moveToNext()){
    String name = cs.getString(cs.getColumnIndex("name"));
    String phone = cs.getString(cs.getColumnIndex("phone"));
    String money = cs.getString(cs.getColumnIndex("money"));
    //把读到的数据封装至Person对象
    Person p = new Person(name, phone, money);
    //把person对象保存至集合中
    people.add(p);
    }

    把集合中的数据显示至屏幕:


    分页查询

    Cursor cs = db.query("person", null, null, null, null, null, null, "0, 10"); //查询表0-10的条目,"10,10":从第10个条目开始向后查询10个


    ListView
    用于显示列表


    MVC结构思想:

    M:model模型层,要显示的数据 ————people集合
    V:view视图层,用户看到的界面 ————ListView
    C:control控制层,操作数据如何显示 ————adapter对象


    BaseAdapter  

    封装度地 自由度高可以定制很多不同样式的listview


    必须实现的两个方法

     第一个 getcount

    //系统调用此方法,用来获知模型层有多少条数据
    @Override
    public int getCount() {
    return people.size();
    }

    第二个getview

    //系统调用此方法,获取要显示至ListView的View对象
    //position:是return的View对象所对应的数据在集合中的位置
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("getView方法调用" + position);
    TextView tv = new TextView(MainActivity.this);
    //拿到集合中的元素
    Person p = people.get(position);
    tv.setText(p.toString());
    
    //把TextView的对象返回出去,它会变成ListView的条目
    return tv;
    }


    屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕


    条目的缓存 

    convertView =


    当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存

    ViewHolder缓存

    class ViewHolder 封装View里的空间 用viewholder.XXXX来取出

    思路写出来了 同学们自己试一下

    MainActivity

    package com.ace.sqlite;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        List<Person> personList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            personList = new ArrayList<Person>();
            //查询数据库
            MyOpenHelper oh = new MyOpenHelper(this);
            SQLiteDatabase db = oh.getWritableDatabase();
            Cursor cursor = db.query("person", null, null, null, null, null, null, null);
            
            while(cursor.moveToNext()){
                String name = cursor.getString(1);
                String phone = cursor.getString(2);
                int salary = cursor.getInt(3);
                
                Person p = new Person(name, phone, salary);
                personList.add(p);
            }
            
            //找到listview
            ListView lv = (ListView) findViewById(R.id.lv);
            //设置显示内容
            lv.setAdapter(new MyAdapter());
            
        }
        
        class MyAdapter extends BaseAdapter{
    
            //系统调用,用来获知模型层有多少条数据
            @Override
            public int getCount() {
                return personList.size();
            }
    
            //系统调用,返回的View对象就会作为ListView的一个条目显示在屏幕上
            //position:该次getView调用返回的View对象在ListView中是第几个条目,position的值就是几
            //convertView:系统之前缓存的条目
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                System.out.println("getView方法调用" + position + ":" + convertView);
                Person p = personList.get(position);
                
    //            TextView tv = new TextView(MainActivity.this);
    //            tv.setText(p.toString());
    //            tv.setTextSize(16);
                
                //获取布局填充器
    //            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    //            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                
    //            View view = inflater.inflate(R.layout.item_listview, null);
                
                View view = null;
                if(convertView == null){
                    //把布局文件填充成view对象
                    view = View.inflate(MainActivity.this, R.layout.item_listview, null);
                    
                }
                else{
                    view = convertView;
                }
                
                //必须使用view.findViewById
                TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
                tv_name.setText(p.getName());
                
                TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
                tv_phone.setText(p.getPhone());
                
                TextView tv_salary = (TextView) view.findViewById(R.id.tv_salary);
                tv_salary.setText(p.getSalary() + "");
                return view;
            }
            
            @Override
            public Object getItem(int position) {
                return null;
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
            
        }
    
    }

    MyOpenHelper

    package com.ace.sqlite;
    
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MyOpenHelper extends SQLiteOpenHelper {
    
        public MyOpenHelper(Context context) {
            //arg1:数据库文件名字
            //arg2:游标工厂,游标等同于结果集,传null使用默认工厂
            //arg3:版本,不能小于1,用于升级
            super(context, "people.db", null, 1);
        }
    
        //创建数据库时调用
        @Override
        public void onCreate(SQLiteDatabase db) {
            //创建表
            db.execSQL("create table person(_id integer primary key autoincrement, name char(10), phone char(20), salary integer(10))");
        }
    
        //升级数据库时调用
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            System.out.println("数据库升级");
        }
    
    }

    Person:

    public class Person {
    
        private String name;
        private String phone;
        private int salary;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public int getSalary() {
            return salary;
        }
        public void setSalary(int salary) {
            this.salary = salary;
        }
        @Override
        public String toString() {
            return "name=" + name + ", phone=" + phone + ", salary="
                    + salary;
        }
        public Person(String name, String phone, int salary) {
            super();
            this.name = name;
            this.phone = phone;
            this.salary = salary;
        }
        
        
    }

    Test:

    public class Test extends AndroidTestCase{
    
    
        public void test(){
            //                                获取虚拟上下文
            MyOpenHelper oh = new MyOpenHelper(getContext());
            //如果数据库不存在,先创建,再打开,如果存在,就直接打开
            SQLiteDatabase db = oh.getWritableDatabase();
            
            //创建50条数据
            ContentValues values = new ContentValues();
            for (int i = 0; i < 50; i++) {
                values.clear();
                values.put("name", "张" + i);
                values.put("phone", "135" +i+i);
                values.put("salary", "2000" + i);
                db.insert("person", null, values);
            }
        }
        
    }

    list_item:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        
        <TextView 
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name"
            android:textSize="25sp"
            />
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentRight="true"
            >
        <TextView 
            android:id="@+id/tv_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="phone"
            />
        <TextView 
            android:id="@+id/tv_salary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="salary"
            />
        </LinearLayout>
    </RelativeLayout>

    activity.xml:

    <LinearLayout 
        xmlns: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" 
        android:orientation="vertical"
        >
        <ListView 
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            ></ListView>
    </LinearLayout>
  • 相关阅读:
    CTF---隐写术入门第二题 小苹果
    文件上传
    文件读取
    sqlmap之绕过waf思路
    【小技巧分享】如何通过微博图片进行社工Po主
    Windows 11恢复传统右键菜单-2021.10.5正式版
    sql注入之Oracle注入
    CTF之buuctf
    常见sql注入payload
    信息收集之Github
  • 原文地址:https://www.cnblogs.com/AceIsSunshineRain/p/5173066.html
Copyright © 2011-2022 走看看