android 之UI 高级控件Adapter(适配器详解)

了解适配器组件:

适配器是一个连接数据源和AdapterView的桥梁,通过它能有效的实现数据源与AdapterView的分离设置,使AdaptereView与数据的绑定更加简便,修改更加方便。


AdapterView与Adapter

1.AadapterView即Adapter(适配器)控件,其内容通常是一个包含多项相同格式资源的列表,每次只显示其中的一项

2.需要先把多项内容放入一个列表,然后将这个列表加载到Adapter控件中。

3.这个存放Adapter控件的内容的列表,在Android将称为Adapter(适配器对象)


android 之UI 高级控件Adapter(适配器详解)_第1张图片

android 之UI 高级控件Adapter(适配器详解)_第2张图片

数组适配器对象具体配对过程:

android 之UI 高级控件Adapter(适配器详解)_第3张图片


实例代码:

前台展示:




    
    





后台逻辑:

package com.example.lenovo.adapter_demo;

import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    //寻找控件
    private ListView listView_names;
    private TextView textView_empty;

    /**
     *数据源
     */
    private List data = new ArrayList<>();

    /**
     *适配器对象
     */
    private ArrayAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.listView_names = (ListView) this.findViewById(R.id.listView_names);
        this.textView_empty = (TextView) this.findViewById(R.id.textView_empty);

        //设置当ListView 控件中条目为空时显示的View对象
        this.listView_names.setEmptyView(this.textView_empty);

    /*//第一种方式:
    String[] data = {"李云龙","楚云飞","张三","李四"};
        ArrayAdapter adapter =  new ArrayAdapter(
                this,//上下文对象
                android.R.layout.simple_list_item_1,//控件每一行显示内容对应的TextView控件对象
                data//数据源
        );
    //设置适配器对象
       this.listView_names.setAdapter(adapter);*/

     /*//方式二:数据源时集合,数据源通过调用适配器对象的addAll()方法添加到适配器对象中
      List data = new ArrayList<>();
        for(int i = 0;i < 5;i++){
         data.add("向往"+i);
        }
        adapter = new ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            data
        );*/
/*
    //方式三:通过调用ArrayAdapter 的静态方法创建数组适配器对象(需要自己在res中添加xml文件)
    ArrayAdapter adpter = ArrayAdapter.createFromResource(
            this,
            R.array.country,//数据源对应的资源id值
            android.R.layout.simple_list_item_1
    );*/

        //注册ListView条目点击监听器对象
        this.listView_names.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            /**
             * 当ListView 条目被点击时自动执行的方法
             * @param parent 事件源,当前就是ListView控件对象
             * @param view  用户点击条目对应的TextView控件对象
             * @param position  用户点击条目控件对应的索引值,索引从0开始
             * @param id    行号,一般和position相等
             *  需求:得到用户点击条目对应的内容
             */

            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                //方式一:通过数据源中的索引值和ListView 控件中条目的索引值一一对应的关系获取数据
                //String item = data.get(position);

                //方式二:通过调用适配器对象的getItem(position)获取数据
                //String item = adapter.getItem(position);

                //方式三:通过调用适配器控件对象的getItemAtPosition(position)方法获取数据
                //String item = parent.getItemAtPosition(position).toString();

                //方式四:通过用户点击条目对应的控件对象获取数据
                String item = ((TextView)view).getText().toString();

                Toast.makeText(MainActivity.this,"item="+item,Toast.LENGTH_LONG).show();
                System.out.println("===OnItemClick(AdapterView parent="+parent+",View view="+view+",int position="+position+",long id ="+id+")====");

            }
        });
        //注册长按ListView_names.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
        /**
         * 当用户长按ListView 控件对象条目时自动调用的方法
         * @param parent 事件源,当前就是ListView控件对象
         * @param view 用户点击条目对应的TextView控件对象
         * @param postion 用户点击条目控件对应的索引值,索引从0开始
         * @parm id 行号,一般和postion相等
         * @return 如果事件被消费则返回true,相反则返回false
         */

       /* @Override
        public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
            //删除用户点击条目对象
            data.remove(position);
            adapter.notifyDataSetChanged();//更新用户界面

            System.out.println("=====onItemLongClick(AdapterView parent="+parent+", View view="+view+", int position="+position+", long id="+id+")=====");
            return  true;//事件是否被消费掉,如果消费掉则返回true,此时就不会在触发OnItemClick 方法了
            }
        });*/
    }
}




你可能感兴趣的:(android)