Android适配器详解

    Android 开发中,适配器扮演了,非常重要的角色,作为组件与数据的桥梁,我们时常会用到适配器,//思路简明扼要莫说废话,总结,常用的适配器有四种,ArrayAdapter,SimpleAdapter,与数据库操作有关的常用SimpleCursorAdapter,剩下一种就是自定义适配器,自定义适配器在前边的文章中,已经详细概述了,适配器离不开,数据源布局和上下文,其实就是将集合中数据,拆成一条条放置在布局文件中,通过适配器给容器使用
    在使用适配器的时候,我们可以自己新建布局对象,也引用系统的,常用的有,android.R.layout.simple_dropdown_item_1line,     android.R.layout.simple_spinner_dropdown_item,若数据源是文本的话可以采用这两个布局,当然你也可以自己新建一个 但是不能有外部容器,ArrayAdapter 常用语文本,而SimpleAdapter 可以实现图文混排,可以自行设置布局,和自定义适配器之间数据源不同,自定义适配器数据源可随意,simpleAdapter适配器的数据源需要是盛有map<String,Object>集合的List
    simpleCursorAdapter 适配器可以通过游标访问数据库,在使用SqLiteDataBase进行一系列的操作之后 返回值通常是Cursor ,此时可以用来构建,simpleCursor 适配器,最后将适配器给容器,(先给容器设置,最后,通过adapter.swap(simpleCursorAdapter adapter))的方式,更改数据源,此处和List 作为数据源不同,不需要,notify 操作。使用simpleCursorAdapter 适配器自定义布局时,和simpleAdapter 类似,但simpleCursorAdapter 的参数略有不同,new String[]{};数组中存放的是,你需要从数据库中查询的字段名,new int[]{},依旧是存放,自定义布局控件的id 值
    需要注意的是,simpleCursorAdapter适配器有六个参数,最后一个flags 为观察者 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
package com.example.loaderapp;

import android.app.Activity;

import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;

public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{

    //Loader 加载
    /**
     * content resolver 在主线程中使用的
     */
    private ListView lv;

    private SimpleCursorAdapter adapter;

    private SearchView search;


    // 这个 uri 是针对 raw_contacts 和 data 两张表连接查询的  注意是 两张
    private Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;    

    private String[] columns = {"_id","display_name","raw_contact_id","data1"};

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

        lv = (ListView) findViewById(R.id.lv);
        search = (SearchView) findViewById(R.id.search);

        adapter = new SimpleCursorAdapter(this, R.layout.item_self,null,new String[]
                {"display_name","data1"}, new int[]{R.id.tv_name,R.id.tv_phone}, 
                SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);



        lv.setAdapter(adapter);

        //② 使用loader 加载数据  使用的 loader 的子类 CursorLoader
            //a) 让activity 或 Fragment 实现一个接口  LoaderCallbacks

        // ③得到loader 管理对象  initLoader 用于初始化 loader
        getLoaderManager().initLoader(7, null, this); // 第一个参数 就是为了 标识 这个 loader 的  第二个参数 传递的参数 没有 就写 Null


        search.setOnQueryTextListener(new OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {

                //输入完了 执行这个方法

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                //输入的过程中执行该方法
                //参数是用户输入的文本
                // 
                Bundle args = new Bundle();
                args.putString("key",newText);

                // 重新启动 Loader 
                getLoaderManager().restartLoader(7, args, MainActivity.this);

                return false;
            }
        });


    }


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        // 创建Loader  Loader 和 resolver  区别 只是 一个主线程 一个子线程 他们是类似的

        String where = null;
        String[] whereArgs = null;

        if(args!=null){

            String data = args.getString("key");
            where = "display_name like ? or data1 like ?";
            //意思是 只要含有就查出来
            whereArgs = new String[]{"%"+data+"%","%"+data+"%"};

        }

        return new CursorLoader(this, contactUri, columns, where, whereArgs, null);



    }



    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        //loader 加载完数据执行 该方法 由主线程执行
                adapter.swapCursor(data);

    }


    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        //重置 Loader的时候执行  相当于  
        adapter.swapCursor(null);// 重新查询了 数据有变化了  重新用 loader 查询数据

    }





}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页