我们在使用手机的时候,通常看到,像通讯录,QQ列表样式的东西,这里来解释一下,其实那些都是一个ListView

今天,我们就来详细的讲解一下ListView这个控件

  ListView中每条显示的数据都称为一个item每个item都有自己的布局

  在这里,我们就先来实现一个简单的功能,用来解释ListView这个控件

我们就来做一个最简单的只显示文本和图片的这样的一个ListView

  我先来和大家一起分析一下我们应该准备些什么:

   首先,我们需要一个主界面布局文件,并在布局文件中定义一个ListView

    然后,我们需要创建一个布局文件,这么布局文件是每个item的布局。因为我们只是显示文本和图片,所以我们的这个item的布局就只是一个简简单单的TextView和一个ImageView

  那么好,我们就来实现一下,这两个布局文件

  我们先来看主界面的布局文件

<?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:id="@+id/activity_main"
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="application.smile.listview.MainActivity"> <ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

  然后,我们再来看一下每个item的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_marginTop="10dp"
android:layout_toRightOf="@+id/iv_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是标题"
android:textSize="20sp"/>
<TextView
android:id="@+id/tv_content"
android:layout_toRightOf="@+id/iv_icon"
android:layout_below="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="这是内容"/>
</RelativeLayout>

这样,我们的两个布局文件就准备完成了。

然后,我们来看Activity中是如何实现的。

  我们首先需要几个想要显示的数据的集合(或者数组),这里就需要两个了,一个用来放图片,一个用来放文字

  然后,我们通过老套路,先找到相应的控件然后设置适配器然后设置点击事件

  然后,因为我们有很多的item需要显示,所以,我们需要一个适配器来将我们的数据显示到屏幕上

  这样,我们就按照我们所想的去打造这么一个Activity

public class MainActivity extends AppCompatActivity {
//存储文字的数组
private String [] names ={"刘备","张飞","诸葛亮","赵云","孙权","周瑜","司马懿","夏侯惇"};
//存储图片的数组
private int [] images = {R.mipmap.liubei,R.mipmap.zhangfei,R.mipmap.zhugeliang,R.mipmap.zhaoyun,
R.mipmap.sunquan,R.mipmap.zhouyu,R.mipmap.simayi,R.mipmap.xiahoudun};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
ListView listView = (ListView) findViewById(R.id.listView);
//设置适配器
listView.setAdapter(new MyAdapter(this));
//设置点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//弹出吐司
Toast.makeText(MainActivity.this, "点我了?我是"+names[position], Toast.LENGTH_SHORT).show();
}
});
} /**
* 自定义适配器,继承BaseAdapter
*/
class MyAdapter extends BaseAdapter{
//维护一个上下文,为了得到布局填充器
private Context context;
//维护一个布局填充器,为了得到每个item 的布局
private LayoutInflater layoutInflater; public MyAdapter(Context context){
//通过构造方法获取布局填充器对象
layoutInflater = LayoutInflater.from(context);
}
//该方法是总共有多少个item
@Override
public int getCount() {
return names.length;
}
//该方法是得到每个item的值
@Override
public Object getItem(int position) {
return names[position];
}
//该方法是得到每个item的id
@Override
public long getItemId(int position) {
return position;
}
//该方法是获得视图,也是这些里面最重要的方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//首先,我们通过布局填充器获得item的布局
View view = layoutInflater.inflate(R.layout.item_layout,null);
//根据item的布局找到图片
ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
//根据item的布局找到标题
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
//根据item的布局找到内容
TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
//设置图片源(也就是我们装图片的那个数组)
iv_icon.setImageResource(images[position]);
//设置标题文字
tv_title.setText(names[position]);
//设置内容文字
tv_content.setText("我是"+names[position]);
//返回item的布局
return view;
}
}
}

  我们通过上面的代码,再来理一理思路。

  首先,我们准备资源。

     //存储文字的数组
private String [] names ={"刘备","张飞","诸葛亮","赵云","孙权","周瑜","司马懿","夏侯惇"};
//存储图片的数组
private int [] images = {R.mipmap.liubei,R.mipmap.zhangfei,R.mipmap.zhugeliang,R.mipmap.zhaoyun,
R.mipmap.sunquan,R.mipmap.zhouyu,R.mipmap.simayi,R.mipmap.xiahoudun};

  然后,我们通过findViewById来找到我们需要的控件,这里就是ListView

  //找到控件
ListView listView = (ListView) findViewById(R.id.listView);

  然后,我们设置适配器

 //设置适配器
listView.setAdapter(new MyAdapter(this));

  这里出现了MyAdapter,一会进行讲解

  然后,我们通过匿名内部类来获得点击事件

     //设置点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//弹出吐司
Toast.makeText(MainActivity.this, "点我了?我是"+names[position], Toast.LENGTH_SHORT).show();
}
});

  接下来,我们就来看一下MyAdapter这个自定义适配器

  我们的适配器有很多,但是为什么我们偏偏选择继承BaseAdapter呢?因为它灵活

  我们继承BaseAdapter之后,我们需要重写四个方法

  在重写那四个方法之前,我们来介绍一下布局填充器。所谓的布局填充器就是通过XML文件去获得里面的布局

  我们在这里通过布局填充器去获得item的布局,但是呢,布局填充器需要一个上下文作为参数

  所以,我们先维护一个上下文一个布局填充器,并通过构造方法获得布局填充器的对象

    //维护一个上下文,为了得到布局填充器
private Context context;
//维护一个布局填充器,为了得到每个item 的布局
private LayoutInflater layoutInflater; public MyAdapter(Context context){
//通过构造方法获取布局填充器对象
layoutInflater = LayoutInflater.from(context);
}

  然后,我们来看看重写的那四个方法

    1.

//该方法是总共有多少个item
@Override
public int getCount() {
return names.length;
}

    2.

//该方法是得到每个item的值
@Override
public Object getItem(int position) {
return names[position];
}

    3.

//该方法是得到每个item的id
@Override
public long getItemId(int position) {
return position;
}

    4.

//该方法是获得视图,也是这些里面最重要的方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//首先,我们通过布局填充器获得item的布局
View view = layoutInflater.inflate(R.layout.item_layout,null);
//根据item的布局找到图片
ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
//根据item的布局找到标题
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
//根据item的布局找到内容
TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
//设置图片源(也就是我们装图片的那个数组)
iv_icon.setImageResource(images[position]);
//设置标题文字
tv_title.setText(names[position]);
//设置内容文字
tv_content.setText("我是"+names[position]);
//返回item的布局
return view;
}

  在这四个方法中getView方法是最重要的方法,主要的逻辑都在这里

  我们先通过布局填充器获得我们的布局并通过布局获得控件,然后设置每个控件的值,最后返回这个item的布局

我们来一起看一下运行的结果

  这样,我们这个简单的listView就完成了

让程序写入生命,将代码融入灵魂

                    -------smile、zj

Android基本控件之ListView(一)的更多相关文章

  1. Android基本控件之listView(三)<用ListView实现分页加载>

    我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...

  2. Android基本控件之ListView(二)<ListView优化>

    之前我们说到ListView的基本用法.但是,有很多的时候会额外的占用一些内存,从而消耗了性能.既然有消耗性能的可能,那么我们就对其做出相应的优化 我们首先来说说优化的步骤: 第一步.将宽和高设置为填 ...

  3. 一步一步学android之控件篇——ListView基本使用

    ListView组件在应用程序中可以说是不可或缺的一部分,ListView主要是显示列表数据,同时可以滚动查看,这篇博客主要是对ListView的基本用法进行说明,后面会依次对ListView点击动态 ...

  4. Android:控件ListView列表项与适配器结合使用

    Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...

  5. Android基础控件ListView基础操作

    1.简介 基于Android基础控件ListView和自定义BaseAdapter适配器情况下,对ListView的数据删除和添加操作: public boolean add(E e) {//添加数据 ...

  6. Android 基本控件相关知识整理

    Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...

  7. Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...

  8. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  9. 与众不同 windows phone (52) - 8.1 新增控件: AutoSuggestBox, ListView, GridView, SemanticZoom

    [源码下载] 与众不同 windows phone (52) - 8.1 新增控件: AutoSuggestBox, ListView, GridView, SemanticZoom 作者:webab ...

随机推荐

  1. 我是面试官--"自我介绍"

    工作10余年,经历过很多次面试,也面试了N多人.这些年来,已经有好些位朋友(或同事)与我聊起相关话题,涉及面试,更关乎职业生涯规划.感触颇多,就借助自媒体的浪潮,与更多的程序员一起共谈面试经历,希望可 ...

  2. 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

    // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...

  3. Hierarchical cluster算法介绍

    突然想记录几个聚类算法,由于实力有限就先介绍一下层次聚类算法(Hierarchical cluster algorithm),这个聚类算法思想简单,但实现起来感觉复杂度挺大:以前看过<集体智慧编 ...

  4. 最简单例子图解JVM内存分配和回收

    一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...

  5. fedora 安装python mysql

    如果你服务器环境允许yum,安装MySQL-python模块就很简单了. 如果直接安装不行,先 安装MySQL-devel后正常运行 yum install mysql-devel yum insta ...

  6. 转】机器学习开源框架Mahout配置与入门研究

    原博文出自于:http://www.ha97.com/5803.html    感谢! PS:机器学习这两年特别火,ATB使劲开百万到几百万年薪招美国牛校的机器学习方向博士,作为一个技术控,也得折腾下 ...

  7. POJ 3159 Candies (栈优化spfa)

    Candies 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description During the kinderga ...

  8. TQJson序列和还原clientdataset.data

    TQJson是QDAC开源项目的JSON对象,其特点是跨平台,功能强大. 序列 procedure TForm2.Button2Click(Sender: TObject);var AJson: TQ ...

  9. DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets

    前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS... 显然,DATASNAP的远程方法必须增加对 ...

  10. 查杀oracle锁表

    ()锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object; ()查看哪个表被锁 sele ...