Android Studio的适配器Adapter以及Adapterview的使用

Android Studio的适配器Adapter以及Adapterview的使用

适配器模式:实现原理类似于数据模型M负责存放数据,通过控制器C将数据显示在相应的视图V上。

数据源:数据、集合、游标

适配器:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter、BaseAdapter

控件:AutoCompleteTextView(自动提示框)、Spinner(下拉列表)、ListView(列表)、GridView(网络图)

适配器

适配器在AdapterView控件和数据源之间扮演着桥梁的角色,提供访问数据源的入口,将从数据源取出的数据项逐项加到AdapterView控件中。

1、ArrayAdapter:适用于列表项只含有文本信息的情况

2、SimpleAdapter:即可以处理列表项全是文本的情况,又可以处理列表项包含其他控件(如图片、文本、按钮等)情况

3、SimpleCursorAdapter:专门用来把一个Cursor中的数据映射到列表中,Cursor中的每一条数据映射为列表中的一项。

4、BaseAdapter:根据xml文件中定义的样式进行列表项的填充,完全自定义数据适配方式,适用性最强。

基本步骤

1、创建数据源,创建AdapterView控件

2、创建适配器

3、绑定数据源

常用的AdapterView

AutoCompleteTextView+ArrayAdapter适配器

AutoCompleteTextView可以根据用户的输入弹出一个智能提示的下拉列表,这样便可以选择相应的选项,当输入的字符串符合数据源里的选项就会出现相关的选项。

ArrayAdapter:

public ArrayAdapter(Context context,int resource,int textViewResourceId,Object[] object,List object);

Context context:Context上下文对象

int resource:对应列表项item的布局文件ID

int textViewResourceId:列表项item布局中对应的TextView的ID

Object[] object:需要显示数据的数组

List object:需要显示数据的集合

布局显示的xml页面:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/autoCompletetextview"
        android:completionHint="国家列表"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

后台代码:

package com.example.adapter;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class MainActivity extends AppCompatActivity {
    
    
    //定义全局变量
    private AutoCompleteTextView autoCompleteTextView;
    //适配器变量
    private ArrayAdapter<String> adapter;

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

        //定义数据源
        String[] context = new String[]{
    
    "China","Britain","Russia","Canada","U.S.A","Chile","Germany"};
        //绑定控件
        autoCompleteTextView = (AutoCompleteTextView)findViewById(R.id.autoCompletetextview);
        //创建Adapter
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,context);

        //将控件绑定到适配器
        autoCompleteTextView.setAdapter(adapter);
        //设置输入的字符的颜色
        autoCompleteTextView.setTextColor(Color.YELLOW);

        //设置输入1个字符后开始提示
        autoCompleteTextView.setThreshold(1);
    }
}

Spinner控件+ArrayAdapter适配器

Spinner是下拉列表控件,当用户点击控件时,下拉列表控件弹出选项列表给用户选择,每次只显示用户选择的选项

Spinner可以有两种方式加载数据:

1、在res/values文件下准备一个数组资源文件,事先定义好要加载的数据资源

2、直接在java代码中使用ArrayAdapter对象。

获取用户点击的下拉列表的选项,可以使用setOnItemSelectedListener()方法。

方法一代码:

布局页面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">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

res/value/itemvalue.xml文件的代码:(数组资源文件代码)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="bookname">
        <item>三国演义</item>
        <item>水浒传</item>
        <item>红楼梦</item>
        <item>西游记</item>
        <item>哑舍</item>
        <item>斗罗大陆</item>
        <item>简爱</item>
        <item>钢铁是怎样炼成的</item>
        <item>史记</item>
    </string-array>
</resources>

后台代码:

package com.example.adapter;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity3 extends AppCompatActivity {
    
    

    //定义全局变量
    private Spinner spinner;
    private ArrayAdapter arrayAdapter;

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

        //绑定XML中对应的Spinner控件
        spinner = findViewById(R.id.spinner);
        
        //将对应的数组资源文件加载进来,然后绑定到适配器上
        arrayAdapter = ArrayAdapter.createFromResource(this,
                R.array.bookname,
                android.R.layout.simple_spinner_item);

        //设置下拉列表的风格
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        //将适配器arrayAdapter添加到spinner控件上
        spinner.setAdapter(arrayAdapter);
        //设置默认选择第一个
        spinner.setSelection(0 , true);

        //添加Spinner的监听事件
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    
    
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
    
                String choose = getResources().getStringArray(R.array.bookname)[position];
                Toast.makeText(MainActivity3.this,"你选择了" + choose,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
    
    

            }
        });



    }
}

页面效果:

在这里插入图片描述

方法二代码:

前面布局XML页面一样。

后台代码:

package com.example.adapter;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity3 extends AppCompatActivity {
    
    

    //定义全局变量
    private Spinner spinner;
    private ArrayAdapter arrayAdapter;
    private String[] item = {
    
    "三国演义","水浒传","红楼梦","西游记","史记","哑舍","斗罗大陆","简爱","钢铁是怎样炼成的","老人与海"};

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

        //绑定XML中对应的Spinner控件
        spinner = findViewById(R.id.spinner);

        //创建适配器
        arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1, item);

        //设置下拉列表的风格
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        //将适配器arrayAdapter添加到spinner控件上
        spinner.setAdapter(arrayAdapter);
        //设置默认选择第一个
        spinner.setSelection(0 , true);

        //添加Spinner的监听事件
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    
    
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
    
                Toast.makeText(MainActivity3.this,"你选择了" + item[position] ,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
    
    

            }
        });
        
    }
}

页面效果:

在这里插入图片描述

ListView和SimpleAdapter适配器

ListView控件以列表形式展现内容,并根据数据的长度自适应显示内容。

可以通过掉用LIstView的setOnItemClickListener()方法,为ListView设置监听用户的点击事件,该监听器需要实现AdapterView.OnItemClickListener接口,并且在onItemClick()方法中给出事件处理代码

onItemLongClick(AdapterView<?> parent, View view, int position, long id)方法:

相关参数:

1、AdapterView<?> parent:发生点击动作的ListView对象

2、View view:在ListView中被点击的View

3、 int position:点击项在ListView中的位置

4、long id:点击项的行id

setOnItemLongClickListener()方法响应用户的长按事件,实现AdapterView.OnItemLongClickListener()接口,并且在onItemLongClick方法中给出事件处理代码

onItemLongClick(AdapterView<?> parent, View view, int position, long id)方法:

相关参数:

1、AdapterView<?> parent:发生点击动作的ListView对象

2、View view:在ListView中被长按的View

3、 int position:被长按的列表项在ListView中的位置

4、long id:被长按的列表项的行id

SimpleAdapter适配器可以实现列表项包含文本和其他控件的效果。

new SimpleAdapter(Context context,List<?extends Map<String, ?>>data,int resource,String[] from,int[] to);

1、Context :Context上下文对象,

2、List<?extends Map

3、int resource:item列表项布局文件的id,用于控制列表项的显示

4、String[] from:一个String数据,对应到Map上的每个<key,value>的key值

5、int[] to:是一个int数组,对应resource列表项布局文件里面每个控件的id,需要与上面String[] from的from相对应。

布局显示的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">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

列表项的布局文件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">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/img01"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="TextView" />
    </LinearLayout>

</LinearLayout>

后台代码:

package com.example.simple;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    
    

    //定义全局变量和创建数据源
    private ListView listView;
    private SimpleAdapter simpleAdapter;
    private List<Map<String, Object>> list;
    private Integer[] imageIDs = {
    
    R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,R.drawable.img05,R.drawable.img06,R.drawable.img07,R.drawable.img08,R.drawable.img09};
    private String[] textIDs = {
    
    "张三","李四","王五","刘六","程七","彭八","王喜","四毛","六六"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    

        super.onCreate(savedInstanceState);
        setContentView(R.layout.listlayout);

        //绑定XML布局文件里面的ListView控件
        listView = findViewById(R.id.listView);
        list = new ArrayList<Map<String, Object>>();

        //把要显示的数据存储到列表
        HashMap<String,Object> map;
        for (int i=0; i<textIDs.length; i++){
    
    
            map = new HashMap<String, Object>();
            map.put("image",imageIDs[i]);
            map.put("name",textIDs[i]);
            map.put("button","详情");
            //添加一行
            list.add(map);
        }

        //生成适配器
        simpleAdapter = new SimpleAdapter(this,list,R.layout.list_ada_layout,new String[]{
    
    "image","name"},new int[]{
    
    R.id.imageView,R.id.textView3});
        //添加并显示
        listView.setAdapter(simpleAdapter);

        //ListView的点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
    
                Toast.makeText(MainActivity.this,"你点击的是"+(position+1)+ "项",Toast.LENGTH_SHORT).show();
            }
        });
        
        
        //ListView的长按事件
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    
    
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    
    
                final int myPosition = position;
                new AlertDialog.Builder(MainActivity.this)
                        .setIcon(R.mipmap.ic_launcher)
                        .setTitle("警告!!")
                        .setMessage("你确定要删除嘛?")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
    
    
                                list.remove(myPosition);
                                simpleAdapter.notifyDataSetChanged();
                            }
                        })
                        .setNegativeButton("取消",null)
                        .create().show();
                return true;
            }
        });

    }
}

猜你喜欢

转载自blog.csdn.net/leilei__66/article/details/109403597