1.ListView

ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。继承图如下所示:

以微信好友列表为例:

里面的每个好友就是由一个个 item 组成的,而每个item都存在Adapter适配器类中(负责数据处理),然后通过ListView显示出来.

2.ListView显示原理

ListView显示数据原理实际就是MVC设计模式,如下图所示:

  • Model(模型) – 数据集合,用来存储数据组织
  • View(视图) – ListView,负责数据显示
  • Controller(控制器) - 负责管理Model,并设置要显示的哪个具体数据.

3.使用BaseAdapter适配器

BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:

public int getCount();
//设置适配器中数据集的数据个数(ListView要显示的所有数据行); public Object getItem(int position):
//获取数据集中与索引对应的数据项; public long getItemId(int position);
//获取指定行对应的ID,一般都是直接返回position public View getView(int position,View convertView,ViewGroup parent);
//获取每一行Item的显示内容。
// position:表示当前获取的Item是哪一行,开头从0开始
// convertView:旧视图复用,如果convertView不为空则表示可以用来复用.无需再次new一个view来使用.
// ViewGroup:只有LinearLayout或者RelativeLayout,如果viewGroup传入一个具体的对象,那么这个方法创建出来的view对象将作为这个viewGroup的childView来显示.

示例效果如下所示:

3.1写activity_main.xml

只是添加了一个ListView:

<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=".MainActivity" > <ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView> </RelativeLayout>

4.2 写item.xml

用来显示每一项item的view视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="20sp"
android:textColor="#000000"
android:text="name" /> <TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_name"
android:text="content"
android:textColor="#88000000"
android:textSize="18sp" /> </RelativeLayout>

 4.3 写MainActivity.java

package com.example.baseadaptertest;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; class Person {
String name;
String content; public Person(String name,String content){
this.name = name;
this.content = content;
}
public String getName() {
return name;
}
public String getContent() {
return content;
}
} public class MainActivity extends Activity { ArrayList<Person> list; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //1.添加要显示的数据
list = new ArrayList<Person>();
list.add(new Person("张三","18岁 电话:158888666"));
list.add(new Person("李四","21岁 电话:158888777"));
list.add(new Person("王二","23岁 电话:158888877"));
list.add(new Person("孙武","25岁 电话:158888997")); //2.设置Adapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(new MyAdapter()); } class MyAdapter extends BaseAdapter{ @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { View view = null; //如果convertView为空则需要重新创建资源视图,如果不为空则表示可以用来复用.无需再次new一个view来使用.
if(convertView==null){
//通过R.layout.item 来创建一个item视图资源
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
}else{ view = convertView;
} //设置要显示的内容
TextView tv_name = (TextView)view.findViewById(R.id.tv_name);
TextView tv_content = (TextView)view.findViewById(R.id.tv_content); tv_name.setText(list.get(position).getName());
tv_content.setText(list.get(position).getContent()); return view;
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

5.使用ArrayAdapter适配器

ArrayAdapter数组适配器用于绑定格式单一的数据,每个item只有一个数据需要被修改,数据源可以是集合或者数组

并且ArrayAdapter可以直接用来使用,无需再继承此类来实现.

ArrayAdapter的构造方法常用的有两种:

public ArrayAdapter(Context context, int resource, T[] objects);
//第一个参数 上下文
//第二个参数 包含且只有一个textview的布局文件id
//第三个参数 要展示的数据数组 public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
//第一个参数 上下文
//第二个参数 可以包含很多内容(ImageView、textview等)的布局文件id
//第三个参数 指向resource中要显示数据的一个textView控件id
//第三个参数 要展示的数据数组

接下来,我们使用第二种构造方法来演示.

效果如下:

5.1 写activity_main.xml

只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致

5.2 写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" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="name"
android:textColor="#AA000000"
android:textSize="40sp" /> </LinearLayout>

5.3 写MainActivity.java

package com.example.arrayadapter;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //定义一个String数组
String[] objects = {"李白","姜子牙","李元芳","高渐离","后羿","王昭君","虞姬"}; //初始化ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects); //设置ArrayAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

6.使用SimpleAdapter适配器

SimpleAdapter适配器适用于拥有多数据的item. 每个item通过Map集合来实现.而Map里则可以包含多个数据.

SimpleAdapter的构造方法如下所示:

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,

            int resource, String[] from, int[] to);

//context: 上下文,填入getApplicationContext()即可
//data:包含了Map(String ,Object)的List数组,每个Map表示每个item数据。
//resource:要加载item的xml布局文件Id
//from:string数组, 用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据
//to:int数组,填入item xml布局文件里的要更改的控件内容ID号 ,用来对应from中的key值,表示设置的key值最终是更改哪些控件内容

效果如下:

6.1 写activity_main.xml

只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致

6.2 写item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" > <ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="17sp"
android:textColor="#000000"
android:text="name" /> <TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_title"
android:layout_alignParentRight="true"
android:layout_below="@+id/tv_title"
android:text="content"
android:textColor="#88000000"
android:textSize="15sp" /> </RelativeLayout>

6.3 写MainActivity.java

package com.example.simpleadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); List<Map<String, String>> data = new ArrayList<Map<String,String>>();
String[] from = {"title","content"};//用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据,这里设置了2个key
int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控件内容ID号 ,用来对应from中的两个key值, //添加内容
Map<String, String> map1 = new HashMap<String, String>();
map1.put("title", "成都5.1级地震");
map1.put("content", "成都市青白江区5.1级地震尚无人员伤亡报告");
data.add(map1); Map<String, String> map2 = new HashMap<String, String>();
map2.put("title", "英雄联盟手游即将上线");
map2.put("content", "期待已久的英雄联盟即将上线...");
data.add(map2); Map<String, String> map3 = new HashMap<String, String>();
map3.put("title", "英语专四考试延期");
map3.put("content", "2020年英语专四专八考试延期...");
data.add(map3); Map<String, String> map4 = new HashMap<String, String>();
map4.put("title", "上海出台减负政策");
map4.put("content", "上海发布抗疫企业减负政策 中小微企业:希望继续加大...");
data.add(map4); Map<String, String> map5 = new HashMap<String, String>();
map5.put("title", "最硬核科蜜");
map5.put("content", "史上最硬核科蜜!穿着24号肩扛RPG伫立战火中...");
data.add(map5); //初始化SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to); //设置SimpleAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

Ps:如果要设置Item点击事件,则通过下面方法设置即可

 ListView  lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) { //parent:被点击的ListView
//view:被点击的条目对象
//postion:第几个被点击的条目索引
//id:通过getItemId()来获取的id号(一般等于postion)
System.out.println("第"+String.valueOf(position)+"个条目被点击了!");
} });

13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用的更多相关文章

  1. Android ArrayAdapter,BaseAdapter,SimpleAdapter适配器绑定数据方法

    /** * 2017-07-31.Book 类 */ public class Book { public String getName() { return name; } public void ...

  2. Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

    在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可 ...

  3. android ListView 和 BaseAdapter 应用

    步聚: 1.建立ListView对象:--(作用:绑定Adapter呈现数据) 2.建立ListView实现的Item栏位.xml布局:--(作用:实现ListView的栏位布局) 3.建立Item. ...

  4. android ListView之BaseAdapter的使用方式

    通常在使用自己定义适配器的时候,我们都会掌握一种固定的模式.充分利用convertView+缓存的方式. private ArrayList<ListBean> list ; privat ...

  5. Android应用项目中BaseAdapter、SimpleAdapter和ArrayAdapter中的三种适配器

    一.写在前面: 本次我们来讲解一下Android应用中三个适配器:BaseAdapter.SimpleAdapter和ArrayAdapter.其中常见的是BaseAdapter,也是个人推荐使用的适 ...

  6. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  7. Android简易实战教程--第十八话《ListView显示,简单的适配器SimpleAdapter》

    本篇介绍Listview的显示,对于listview有许多的适配器,如ArrayAdapter,BaseAdapter,SimpleAdapter等等.本篇先热身一下,介绍最简单的SimpleAdap ...

  8. Android -- ListView(SimpleAdapter) 自定义适配器

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...

  9. BaseAdapter&ArrayAdapter在ListView中应用

    一:BaseAdapter:共同实现的基类的适配器,是ArrayAdapter SimpleAdapter等的父类, 一般用于比较复杂的ListView,扩展性强. 详细信息可查看谷歌官方API:ht ...

随机推荐

  1. 如何取消chrome的自动翻译

    设置中搜索“翻译” 然后关掉“询问是否翻译非您所用语言的网页”的选项即可 需要翻译的时候在目标网页右键“翻译成中文”即可 用github的时候烦的要死,翻译的贼不准.

  2. 初入计科,首次接触C的感受

    1 你对计算机科学与技术专业了解是怎样? 答:一开始我对这个专业并无了解,觉得无非是把电脑给学透.经过一周的学习后,我深刻地感觉自己对这个专业深深的误解. 通过翻阅书籍,上网浏览相关信息,我认为该专业 ...

  3. CentOS 6.6 下源码编译安装MySQL 5.7.5

    版权声明:转自:http://www.linuxidc.com/Linux/2015-08/121667.htm 说明:CentOS 6.6 下源码编译安装MySQL 5.7.5 1. 安装相关工具# ...

  4. Shell之信号捕获

    前言 当我们在运行某一段代码的时候,希望有类似事物一样的操作,要么成功,要么失败:一般的shell脚本都是自上而下,从左之后运行,碰到异常信号就会出错,从而终止脚本的运行,这个时候脚本可能运行到某一处 ...

  5. 硬件原理系列之LED数码管(一)

    LED数码管也叫数码显示器,由8段(7段,8多一位小数点)发光二极管组成,控制不同组合,就可以显示不同字符 dp示小数点,COM为公共端,根据连接方式的不同,分为共阴极和共阳极 工作原理:若选用共阴极 ...

  6. 024.Python模块OS模块

    一 OS模块 对系统进行操作 1.1 popen 可以把运行的结果,这个字符串转化成utf-8这样的编码格式在进行输出 import os res = os.popen("ifconfig& ...

  7. Spring Boot 2.x基础教程:使用国产数据库连接池Druid

    上一节,我们介绍了Spring Boot在JDBC模块中自动化配置使用的默认数据源HikariCP.接下来这一节,我们将介绍另外一个被广泛应用的开源数据源:Druid. Druid是由阿里巴巴数据库事 ...

  8. provider networks和self-service networks

    Provider Network 服务布局 Self-Service Network 网络布局: 网络布局 Provider Networks概述  Provider networks - Conne ...

  9. Kafka常用topic操作命令汇总

    offset topic consumer-group consumer producer producer-golang topic 工具 https://cwiki.apache.org/conf ...

  10. Pycharm创建Django项目显示python non-zero exit code(1)错误

    好久时间没有做Django的项目了,今天创建项目竟然报Non-zero exit code(1)错误 查明原因是因为pip不是最新版本,需要执行以下命令:python -m pip install - ...