Android 高级控件ArrayAdapter用法

 在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。在Android中有这样一种高级控件,他的实现过程就类似于MVC框架。之所以称它高级,是因为他的使用不像其他控件一样,拖拽到界面上就能用,而是需要通过适配器将某些样式的数据或控件添加到其上而使用,这样的控件就是我们今天要说的AdapterView。

   一:AdapterView-->V(视图)

1:作用

以列表的形式显示数据。

2:内容

AdapterView的内容一般是包含多项相同格式资源的列表。

3:特点

(1)将前端显示和后端数据分离

(2)内容不能通过ListView.add的形式添加列表项,需指定一个Adapter对象,通过它获得显示数据

(3)ListView相当于MVC框架中的V(视图)

(4)Adapter相当于MVC框架中的C(控制器)

(5)数据源相当于MVC框架中的M(模型)

(6)超出屏幕显示之后,自动加上滚动条

4:分类

(1)ListView:列表,其中只能含有一个控件TextView,

(2)Spinner:下拉列表,给用户提供选择

(3)Gallery:缩略图,已经被水平的ScrollView和ViewPicker取代,但也还算常用,是一个可以把子项以中心锁定,水平滚动的列表

(4)GridView:网格图,以表格形式显示资源,可以左右滑动的

5:事件

(1)用户单击列表项事件

◆为列表加载setOnItemClieckListener监听,重写onItemClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

(2)用户长按事件

◆为列表加载setOnItemLongClieckListener监听,重写onItemLongClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

6:数据填充

借助下面的Adapter适配器对象从数据源中进行适配

二:Adapter-->C(控制器)

1:作用

把数据源中数据以某种样式(xml文件)显示在视图中。

2:分类

(1)ArrayAdapter:他只能处理列表项内容全是文本的情况。

       ◆数据源:数组或者List<String>对象或者其他

(2)SimpleAdapter: 他不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。

       ◆数据源:只能为List<Map<“键”,“值”>>形式的数据

(3)自定义Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。

(4)SimpleCursorAdapter:专门用于把游标中的数据映像到列表中(我们以后再来研究)

3:自定义Adapter

1)创建类,继承自BaseAdapter

(2)重写其中的四个方法

①int getCount():返回的是数据源对象的个数,即列表项数

②Object getItem(int position):返回指定位置position上的列表

③long getItemId(int position):返回指定位置处的行ID

View getView():返回列表项对应的视图,方法体中

实例化视图填充器

◆用视图填充器,根据Xml文件,实例化视图

◆根据布局找到控件,并设置属性

◆返回View视图

三:数据填充

1:声明AdapterView对象,根据ID利用findViewById方法找到此对象

2:声明Adapter对象,根据构造方法实例化此对象。具体如下:

(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);

(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

   (3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;

3:绑定Adapter对象到Adapter上

AdapterView对象.setAdapter(Adapter对象);

1)ArrayAdapter

列表的显示需要三个元素:

a.ListVeiw 用来展示列表的View。

b.适配器 用来把数据映射到ListView上的中介。

c.数据    具体的将被映射的字符串,图片,或者基本组件。


一.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.xiaoyun.listview.MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />
</RelativeLayout>

main文件

package com.example.xiaoyun.listview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {
    private ListView ls;

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

        ls=(ListView)findViewById(R.id.listView);
        ls.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,getData()));
//        setContentView(ls);
    }
    private List<String> getData()
    {
        List<String> data=new ArrayList<String>();
        data.add("1");
        data.add("2");
        data.add("3");
        data.add("4");
        return data;

    }
}
<img src="https://img-blog.csdn.net/20160305122005504?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


2)SimpleAdapter
  simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
Added in  API level 1

Constructor

Context : The context where the View associated with this SimpleAdapter is running
List: A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"
int: Resource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"
String: A list of column names that will be added to the Map associated with each item.
int : The views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.

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


    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="3px" />

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

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="40sp" />

        <TextView
            android:id="@+id/info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>
main.java
package com.example.xiaoyun.simpleadapter;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

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

import android.app.ListActivity;
import android.os.Bundle;

import javax.sql.RowSetListener;

//要改成继承自ListActivity!!!!!
public class MainActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        下面这句话是一定不需要的
//        setContentView(R.layout.activity_main);
//
        SimpleAdapter adapter = new SimpleAdapter(this
                , getData(), R.layout.activity_main, new String[]{"img", "title", "info"},
                new int[]{R.id.img, R.id.title, R.id.info}
        );
//        在当前视图view绑定adapter适配器
        setListAdapter(adapter);
    }

//数据源
    private List<Map<String, Object>> getData() {
//        创建list并将每一个map添加到list中
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();

        map.put("img", R.drawable.bookmark);
        map.put("title", "Book");
        map.put("info", "aa");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("img", R.drawable.calendar);
        map.put("title", "calendar");
        map.put("info", "adf");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("img", R.drawable.camera);
        map.put("title", "camera");
        map.put("info", "ca");
        list.add(map);
//        返回list
        return list;
    }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值