zoukankan      html  css  js  c++  java
  • android 学习随笔五(界面)

    • 把数据库内容显示到界面
    1. 清单文件设置为线性布局(5大布局属于ViewGroup)
    2. 在清单文件中可以增加View显示

    LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
    for(Person p : people){
    //创建TextView,每条数据用一个文本框显示
    TextView tv = new TextView(this);
    tv.setText(p.toString());
    //把文本框设置为ll的子节点
    ll.addView(tv);

    • 把数据库内容显示到ListView
    1. MVC结构
      * M:model模型层,要显示的数据 ————people集合
      * V:view视图层,用户看到的界面 ————ListView
      * c:control控制层,操作数据如何显示 ————adapter对象

    2. ListView界面显示的内容为getview动态调用内容,滚动消失的内容自动销毁
    3. 每一个条目都是一个View对象
    4. 实现BaseAdapter接口,必须实现的两个方法

       第一个

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

       第二个

      //系统调用此方法,获取要显示至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;
      }

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

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

    7.  只要内存中有条目缓存,在新的条目出现时,就会使用缓存

    -------------------------------------------------------------------------------------------

    <?xml version="1.0" encoding="utf-8"?>
    <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>

    ---------------------------------------------------------------------------------------------

    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);

    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 lv= (ListView) findViewById(R.id.lv);
    lv.setAdapter(new MyAdapter());
    }

    class MyAdapter extends BaseAdapter{

    //系统调用,用来获知多少条数据
    @Override
    public int getCount() {
    return personList.size();
    }

    //系统调用,返回的View对象作为ListView的一个条目显示,调用的次数为getCount()的返回值

    //convertView 系统之前缓存的条目,界面能显示多条条目,就会缓存多少条,而不是将所有条目都缓存,比如总共查出1000条记录但界面能够显示20条,则缓存20条
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

    Person p= personList.get(position);

    // TextView tv= new TextView(MainActivity.this);
    // tv.setText(p.toString());
    // tv.setTextSize(15);
    //把布局文件填充成view对象

    View view = null;
    if(convertView ==null)
    {
    //把布局文件填充成view对象
    view = View.inflate(MainActivity.this, R.layout.item_view, null);

    //不能在此设置TextView tv_name= (TextView) view.findViewById(R.id.tv_name) 等值,否则相同的记录重复出现, 

    //因为只要内存中有条目缓存,在新的条目出现时,就会使用缓存,所以每次要重新设置条目的值

    }
    else{
    view = convertView;
    }



    //获取布局填充器另外一种方法
    // LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    // View view = inflater.inflate(R.layout.item_view, null);

    //获取布局填充器另外一种方法
    // LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    // View view = inflater.inflate(R.layout.item_view, null);


    //findViewById默认在setContentView(R.layout.activity_main)布局文件中找
    //如果资源不在setContentView设置的布局文件中可以通过view.findViewById来找
    TextView tv_name= (TextView) view.findViewById(R.id.tv_name);
    TextView tv_phone= (TextView) view.findViewById(R.id.tv_phone);
    TextView tv_salary= (TextView) view.findViewById(R.id.tv_salary);

    tv_name.setText(p.getName());
    tv_phone.setText(p.getPhone());
    tv_salary.setText(p.getSalary() + "");
    return view;
    }

    @Override
    public Object getItem(int position) {
    return null;
    }

    @Override
    public long getItemId(int position) {
    return 0;
    }
    }
    }

    ----------------------------------------------------------------------------------------------

    • ArrayAdapter(封装好的adapter,无需实现接口方法)

    ------------------------------------------------------------------------------------------------ 

    item_listview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/photo1"
    />
    <TextView
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="name"
    android:textSize="30sp"
    android:layout_gravity="center_vertical"
    />

    </LinearLayout>

    ------------------------------------------------------------------------------------------------

    String[] objects = new String[]{
    "张三",
    "李斯",
    "王婆"
    };
    ListView lv = (ListView) findViewById(R.id.lv);
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, //指定作为条目的布局文件
    R.id.tv, //指定文本显示在那个文本框
    objects));
    }

    • SimpleAdapter(封装好的adapter,无需实现接口方法)

    ---------------------

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] objects = new String[]{
    "张三",
    "李斯",
    "王婆"
    };
    ListView lv = (ListView) findViewById(R.id.lv);
    // lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, //指定作为条目的布局文件
    // R.id.tv, //指定文本显示在那个文本框
    // objects));

    //把每个条目需要处理的所有数据封装至MAP中,再把map封装至list中,
    //这样就保证了list每个元素都包含了一个条目需要的所有数据
    List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
    Map<String, Object> map1 = new HashMap<String, Object>();
    map1.put("name", "张三");
    map1.put("photo", R.drawable.photo1);
    data.add(map1);

    Map<String, Object> map2 = new HashMap<String, Object>();
    map2.put("name", "张四");
    map2.put("photo", R.drawable.photo1);
    data.add(map2);

    Map<String, Object> map3 = new HashMap<String, Object>();
    map3.put("name", "张五");
    map3.put("photo", R.drawable.photo1);
    data.add(map3);

    lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview,
    new String[]{"name","photo"}, //存放键的数组
    new int[]{R.id.tv,R.id.iv}));//跟键对应的资源
    }

  • 相关阅读:
    C# 还原SQL数据库(非存储过程方式)
    C# 无边框窗体移动代码
    SQL 2008 R2 数据库镜像操作
    序列号
    Oracle VM VirtualBox 随系统自动启动虚拟机的方法
    SQL每个用户最后的一条记录
    JS判断是否在微信浏览器打开
    使用device.js检测设备并实现不同设备展示不同网页
    check单选框多个全选与取消全选
    判断滚动是否到达底部
  • 原文地址:https://www.cnblogs.com/ecollab/p/5885356.html
Copyright © 2011-2022 走看看