这一节咱们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会运用Adapter很重要, Adapter是用来帮助填充数据的中心桥梁,简略来说便是:将各种数据以适宜的方式显现到view上,供给 给用户看!

1.MVC形式的简略了解

在开端学习Adapter之前咱们要来了解下这个MVC形式概念。 举个例子:大型的商业程序一般由多人一起开发完成,比如有人担任操作接口的规划与规划, 有人担任程序代码的编写,假如要能够做到程序项目的分工就必须在程序的结构上做适宜的组织 。假如接口规划与修正都涉及到程序代码的改动的话,那么两者的分工就会形成履行上的困难, 良好的程序架构师将整个程序项目划分为如图的三个部分:

Adapter讲解

  • Model:一般能够了解为数据,担任履行程序的中心运算与判别逻辑,,经过view取得用户 输入的数据,然后依据从数据库查询相关的信息,最终进行运算和判别,再将得到的成果交给view来显现
  • view:用户的操作接口,说白了便是GUI,应该运用哪种接口组件,组件间的摆放位置与次序都需要规划
  • Controller:控制器,作为model与view之间的枢纽,担任控制程序的履行流程以及对象之间的一个互动

Adapter则是中心的这个Controller的部分:Model(数据) —>Controller(以什么方式显现到)—>View(用户界面) 这便是简略MVC组件的简略了解!

2.Adapter概念解析

首要咱们来看看他的承继结构图

Adapter讲解

上面便是Adapter以及承继结构图了,接着咱们介绍一下实践开发中还用到的几个Adapter吧!

  • BaseAdapter:抽象类,实践开发中咱们会承继这个类而且重写相关办法,用得最多的一个Adapter!
  • ArrayAdapter:支撑泛型操作,最简略的一个Adapter,只能展示一行文字~
  • SimpleAdapter:相同具有良好扩展性的一个Adapter,能够自定义多种作用!
  • SimpleCursorAdapter:用于显现简略文本类型的listView,一般在数据库那里会用到,不过有点过期, 不推荐运用!

3.代码示例:

好的,多说无益,写代码最实践,接下来咱们来用写几个简略的Adapter实例, 帮助咱们了解Adapter给咱们带来的便当,另外,因为Adapter需要结合ListView, GridView等等控件讲解,一些高档一点的用法咱们都放在ListView那里讲!

1)ArrayAdapte

代码完成:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创立ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_expandable_list_item_1,strs);
**一些相关的东西:**
**1.** 除了经过数组外,咱们还能够写到一个数组资源文件中:
比如:在res\valuse下创立一个数组资源的xml文件:**arrays.xml**:
语文 数学 英语 “`

接着布局的listview属性设置下这个列表项:

<ListView
        android:id="@id/list_test"  
        android:layout_height="match_parent"  
        android:layout_width="match_parent"   
        android:entries="@array/myarray"/>

就能够了~

当然咱们也能够在Java代码中这样写:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.myarray,android.R.layout.simple_list_item_multiple_choice );

相同也是能够的!

2. 一开端也说了这个ArrayAdapter支撑泛型,那么调集必不可少啦,比如,这样写:

List<String> data = new ArrayList<String>();
data.add("小猫");
data.add("小狗");
ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_expandable_list_item_1,data);

就能够了~

3. 咱们看到了在实例化ArrayAdapter的第二个参数:android.R.layout.simple_expandable_list_item_1其实这些是系统给咱们供给好的一些ListView模板。

2)SimpleAdapter运用示例:

SimpleAdapter:简略的Adapter,看似简略,功能强大,下面咱们来写个稍微杂乱一点的列表 布局吧!

3)SimpleCursorAdapter运用示例:

尽管这东西过期了,不过关于不怎么会SQLite的初学者来说,用起来仍是蛮便利的! 记得前面咱们学ContentProivder写过的读取联系人的例子么?之前是经过打印Log的 方式显现出来,现在咱们经过这个SimpleCursorAdapter把它显现到ListView上!

完成作用图:

Adapter讲解

代码完成

先写下listView每个item的布局:

list_item.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="match_parent"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/list_name"
        android:layout_width="0dp"
        android:layout_height="64dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="小鸟"
        android:textColor="#0000FF"
        android:textSize="18sp" />
    <TextView
        android:id="@+id/list_phone"
        android:layout_width="0dp"
        android:layout_height="64dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="13798989898"
        android:textColor="#EA5C4D"
        android:textSize="18sp" />
</LinearLayout>

接着activity_main布局和前面的一样,便是简略的ListView,然后是

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView list_test = (ListView) findViewById(R.id.list_test);
        //读取联系人
        Cursor cursor = getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        SimpleCursorAdapter spcAdapter = new SimpleCursorAdapter(this,R.layout.list_item,cursor,
                new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER},
                new int[]{R.id.list_name,R.id.list_phone});
        list_test.setAdapter(spcAdapter);
    }
}

最终AndroidManifest.xml里加个读联系人的权限就能够了!

<uses-permission android:name="android.permission.READ_CONTACTS"/>

一问一答:

:就这么简略? ——答:是的,直接获取到Cursor,然后绑定就好了,无需你自己再写什么SQL句子!:你说这东西过期了,那拿什么来代替? ——答:一般的做法是自己重写BaseAdapter,获取到数据调集后跟对应的控件进行绑定!:这个SimpleCursorAdapter还有没有要注意的当地? ——答:有,运用SimpleCursorAdapter的话,绑定的数据库表中一定要有id这个字段, 或许asid;而且在绑定时取出的数据必须包括这个id项,不然的话会报以下过错!java.lang.IllegalArgumentException: column ‘ id’ does not exist**