文章目录

  • 1 ListView概述
  • 2 适配器
    • 2.1 ArrayAdapter
    • 2.2 SimpleAdapter
    • 2.3 BaseAdapter

1 ListView概述

下面看一下ListView的应用场景:


2 适配器

先看下适配器的使用步骤:

  1. 准备布局(每一项的显示效果)
  2. 准备数据源
  3. 实例化适配器(布局+数据源)
  4. 为ListView设置适配器

2.1 ArrayAdapter

效果如下:

代码也十分简单:

package com.example.listviewdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;/*** 1.准备布局(每一项的显示效果)* 2.准备数据源* 3.实例化适配器(布局+数据源)* 4.为ListView设置适配器*/
public class ArrayActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_array);ListView listView1 = findViewById(R.id.list_view1);//参数1:环境上下文(this)//参数2:代表数据项所应用的布局//参数3:数据源(数组)String[] data = {"AA","BB","CC","DD","EE","FF","GG","AA","BB","CC","DD","EE","FF","GG","AA","BB","CC","DD","EE","FF","GG","AA","BB","CC","DD","EE","FF","GG"};//使用自定义资源ArrayAdapter adapter = new ArrayAdapter(this,R.layout.item2,R.id.txt1,data);listView1.setAdapter(adapter);}
}

2.2 SimpleAdapter

先看下要实现的效果:

首先我们要自定义列表显示的layout:

<?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="wrap_content"><ImageViewandroid:id="@+id/qq_img"android:layout_width="50dp"android:layout_height="65dp"android:background="@mipmap/caocao"/><TextViewandroid:id="@+id/qq_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@id/qq_img"android:textSize="26sp"android:text="曹操"/><TextViewandroid:id="@+id/qq_mood"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@id/qq_img"android:layout_below="@id/qq_name"android:textColor="#00ffff"android:text="测试数据"/>
</RelativeLayout>

然后定义Activity对应的Layout:

<?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=".SimpleActivity"><ListViewandroid:id="@+id/list_view2"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>
</androidx.constraintlayout.widget.ConstraintLayout>

然后看下Java代码:

package com.example.listviewdemo;import androidx.appcompat.app.AppCompatActivity;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 SimpleActivity extends AppCompatActivity {private List<Map<String,Object>> data = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple);//获取ListView对象ListView listView2 = findViewById(R.id.list_view2);//实例化适配器对象//参数1:this//参数2:数据源initData();//参数3:每一项布局//参数4:数据来源的key数组String[] from = {"img","name","mood"};//参数5:数据去向的id数组int[] to = {R.id.qq_img,R.id.qq_name,R.id.qq_mood};//参数45对应索引上,from数组的元素代码数据源每个map的key,该key所指代的数据//会作为to数组对应索引上id所代表的控件的内容显示处理SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.item3,from,to);//为ListView设置适配器listView2.setAdapter(adapter);//点击事件listView2.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {//用Toast提示Name  MoodMap<String,Object> map = data.get(i);String name = map.get("name").toString();String mood = map.get("mood").toString();Toast.makeText(SimpleActivity.this,name+"   "+mood,Toast.LENGTH_SHORT).show();}});}public void initData(){//左边:头像   右上:名字   右下:心情Map<String,Object> map1 = new HashMap<>();map1.put("img",R.mipmap.caocao);map1.put("name","曹操");map1.put("mood","宁教我负天下人,休教天下人负我");Map<String,Object> map2 = new HashMap<>();map2.put("img",R.mipmap.zhenji);map2.put("name","甄姬");map2.put("mood","飘摇兮若流风之回雪,仿佛兮若轻云之蔽月");Map<String,Object> map3 = new HashMap<>();map3.put("img",R.mipmap.simayi);map3.put("name","司马懿");map3.put("mood","无奈天命之子");Map<String,Object> map4 = new HashMap<>();map4.put("img",R.mipmap.guojia);map4.put("name","郭嘉");map4.put("mood","哦");Map<String,Object> map5 = new HashMap<>();map5.put("img",R.mipmap.caocao);map5.put("name","曹操");map5.put("mood","宁教我负天下人,休教天下人负我");Map<String,Object> map6 = new HashMap<>();map6.put("img",R.mipmap.zhenji);map6.put("name","甄姬");map6.put("mood","飘摇兮若流风之回雪,仿佛兮若轻云之蔽月");Map<String,Object> map7 = new HashMap<>();map7.put("img",R.mipmap.simayi);map7.put("name","司马懿");map7.put("mood","无奈天命之子");Map<String,Object> map8 = new HashMap<>();map8.put("img",R.mipmap.guojia);map8.put("name","郭嘉");map8.put("mood","哦");data.add(map1);data.add(map2);data.add(map3);data.add(map4);data.add(map5);data.add(map6);data.add(map7);data.add(map8);}
}

2.3 BaseAdapter

下面先看下要实现的效果:

首先看下主页面的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context=".BaseActivity"><ListViewandroid:id="@+id/list_view3"android:layout_width="match_parent"android:layout_height="match_parent"></ListView><ImageViewandroid:id="@+id/write"android:layout_width="80dp"android:layout_height="80dp"android:src="@mipmap/write"android:layout_gravity="right|bottom"android:layout_margin="40dp"/>
</FrameLayout>

然后看下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="wrap_content"><!--头像,昵称,发表时间(静态),发表内容,点赞,评论,转发--><ImageViewandroid:id="@+id/profile"android:layout_width="80dp"android:layout_height="80dp"android:src="@mipmap/profile1"android:layout_margin="5dp"/><TextViewandroid:id="@+id/nickname"android:layout_width="match_parent"android:layout_height="40dp"android:text="用户1"android:textSize="26sp"android:layout_toRightOf="@id/profile"android:layout_marginTop="5dp"/><TextViewandroid:layout_width="match_parent"android:layout_height="40dp"android:text="2048-10-24"android:textSize="22sp"android:layout_toRightOf="@id/profile"android:layout_below="@id/nickname"/><TextViewandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="啊,多么有意义的日子呀!!"android:textSize="22sp"android:layout_below="@id/profile"/><ImageViewandroid:id="@+id/repost"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/repost"android:layout_below="@id/content"android:layout_alignParentRight="true"android:layout_marginRight="10dp"/><ImageViewandroid:id="@+id/comment"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/comment"android:layout_below="@id/content"android:layout_toLeftOf="@id/repost"android:layout_marginRight="10dp"/><ImageViewandroid:id="@+id/like"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/like"android:layout_below="@id/content"android:layout_toLeftOf="@id/comment"android:layout_marginRight="10dp"/>
</RelativeLayout>

这里我们需要定义一个实体类,实体类如下:

package com.example.listviewdemo;public class Msg {private int profile;private String nickname;private String content;private boolean isLike;public int getProfile() {return profile;}public void setProfile(int profile) {this.profile = profile;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isLike() {return isLike;}public void setLike(boolean like) {isLike = like;}public Msg(int profile, String nickname, String content, boolean isLike) {this.profile = profile;this.nickname = nickname;this.content = content;this.isLike = isLike;}
}

然后我们需要定义自己的Adapter类:

package com.example.listviewdemo;import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import java.util.List;//根据准备好的数据源和子项布局完成ListView效果的一一设置
//做出一些细节处理
public class MyAdapter extends BaseAdapter {private List<Msg> list;private Context ctx;public MyAdapter(List<Msg> list, Context ctx){this.list = list;this.ctx = ctx;}//获取数量(设置ListView的长度)@Overridepublic int getCount() {return list.size();}//获取视图(设置ListView每一项的显示效果)--每个视图出现时都会执行@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {//完成对view的设置//将布局资源转为View//参数1:你所要引用的布局资源//RecycleBinViewHolder holder;if(view == null) {Log.e("TAG", "======" + i);//优化1:利用进入RecycleBin中的View,减少读view的赋值 (数据项看不到时相关视图就会进入RecycleBin中)view = LayoutInflater.from(ctx).inflate(R.layout.item4, null);holder = new ViewHolder();holder.profile = view.findViewById(R.id.profile);holder.nickname = view.findViewById(R.id.nickname);holder.content = view.findViewById(R.id.content);holder.like = view.findViewById(R.id.like);holder.comment = view.findViewById(R.id.comment);holder.repost = view.findViewById(R.id.repost);view.setTag(holder);}else{//通过getTag()取出ViewHolder对象,然后能过直接通过holder.控件的方式在外面直接操作控件//从而避免了大幅度使用findViewById操作//而事实上,getTag()本身操作效率高holder = (ViewHolder) view.getTag();}Msg m = list.get(i);//头像
//        ImageView profile = view.findViewById(R.id.profile);holder.profile.setImageResource(m.getProfile());//昵称
//        TextView nickname = view.findViewById(R.id.nickname);holder.nickname.setText(m.getNickname());//内容
//        TextView content = view.findViewById(R.id.content);holder.content.setText(m.getContent());//是否点赞
//        ImageView like = view.findViewById(R.id.like);if(m.isLike()){holder.like.setImageResource(R.mipmap.liked);}else{holder.like.setImageResource(R.mipmap.like);}//评论
//        ImageView comment = view.findViewById(R.id.comment);holder.comment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"你点击了评论",Toast.LENGTH_SHORT).show();}});//转发
//        ImageView repost = view.findViewById(R.id.repost);holder.repost.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"--------转发----------",Toast.LENGTH_SHORT).show();}});return view;}//==============================================酱油方法//获取子项@Overridepublic Object getItem(int i) {return null;}//获取子项id@Overridepublic long getItemId(int i) {return 0;}//1.自定义一个类,叫做ViewHolder//2.将需要保存的视图声明为公开的属性//3.什么时候保存?当view为null时,完成对ViewHolder的实例化工作,并为各个控件属性赋值//4.什么时候用?  什么时候都要用(性能的提升是在view不为null时体现,滚动ListView时体现)//5.怎么用?当view为null时,完成了ViewHolder及内部控件属性的初始化工作后,调用一句代码//view.setTag(holder);//当view不为null时,holder = view.getTag();static class ViewHolder{public ImageView profile,like,comment,repost;public TextView nickname,content;}
}

接下来看下最后的Activity:

package com.example.listviewdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;import java.util.ArrayList;
import java.util.List;public class BaseActivity extends AppCompatActivity {private ListView listView3;private ImageView write;private List<Msg> list = new ArrayList<>();private int[] ps = {R.mipmap.profile1,R.mipmap.profile2,R.mipmap.profile3,R.mipmap.profile4,R.mipmap.profile5,R.mipmap.profile6,R.mipmap.profile7,R.mipmap.profile8};private BaseAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_base);listView3 = findViewById(R.id.list_view3);write = findViewById(R.id.write);initData();//需要传的参数:环境,数据源adapter = new MyAdapter(list,this);//设置适配器listView3.setAdapter(adapter);write.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Msg m = new Msg(R.mipmap.profile9,"paradox","这是动态新增的说说",false);list.add(m);//通知适配器更新数据adapter.notifyDataSetChanged();//设置listview自动显示到最新数据listView3.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);}});}private void initData() {for(int i = 1 ; i <= 8 ; i++){Msg m = new Msg(ps[i-1],"用户"+i,"今天天气好晴朗,慕课处处好风光"+i,i%2==0?true:false);list.add(m);}}
}

我们可以看到在ListView中进行了2个优化。ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。

Android中的ListView相关推荐

  1. android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法

    今天实现listview的下拉刷新和上拉加载的时候,遇到了一个问题,*就是说需要根据listview中滑动的位置来进行下拉刷新和上拉加载.* 具体点,只有当我的listview滑动到最顶部的时候,这时 ...

  2. android 新闻功能列表,Android中通过ListView的实现简单新闻列表

    Android中通过ListView的实现简单新闻列表.本文分为两个部分,第一个部分是最基础的运用ListView实现列表展示.第二个部分是运用ListView实现新闻列表的展示. 这张图片是关于控件 ...

  3. android listview qq,Android中使用listview实现qq/微信好友列表

    首先附上运行结果: 如果你没有学过listview请你先看一看基本知识.不想再说的那么细了 太多了. 首先是listview布局 android:id="@+id/lv_view" ...

  4. android listview单击,如何在Android中处理ListView单击

    如何在Android中处理ListView单击 如何在ListView上收听点击事件? 这就是我现在拥有的 ListView list = (ListView)findViewById(R.id.Li ...

  5. android中设置ListView的选中的Item的背景颜色(附源码)

    http://longyi-java.iteye.com/blog/976067 ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了 ...

  6. android中的 listview,Android中ListView的初步认识(一)

    ListView是安卓开发中常用的组件之一,它的作用是在一个垂直的列表中展现出所需的项目.接下来,我们看一下ListView的实现方法: 第一种 是常见的在XML中定义然后在activity中使用fi ...

  7. android listview 刷新不正确,Android中设置ListView内容刷新问题

    最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来.在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决 ...

  8. android中的 listview控件,聊聊Android中的ListView控件

    软硬件环境 Macbook Pro MGX 72 Android Studio 1.3.2 坚果手机 前言 ListView是Android系统中使用非常广泛的一种控件,几乎所有的App都会用到它.它 ...

  9. Android中设置ListView内容刷新问题

    最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来.在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决 ...

最新文章

  1. linux之netstat使用--10个常用的命令
  2. Datawhale-零基础入门NLP-新闻文本分类Task03
  3. 全系统翻译 macOS Monterey这个新功能简直了
  4. 伯乐发卡系统源码 可用
  5. 微信回应 WeTool 被封事件;支付宝小程序开放直播功能;Raspberry Pi 4 发布 8GB 版本| 极客头条...
  6. 【LoadRunner技术讲座8】LoadRunner函数中的几个陷阱
  7. 终止正在运行的VBS脚本
  8. python入门经典100例-Python3经典100例(Python3入门习题) 含答案 doc版
  9. 【android原生态RPG游戏框架源码】
  10. MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
  11. 矩阵论与计算机英语论文,矩阵论翻译论文.pdf
  12. 74HC573锁存器
  13. 利用清华镜像站解决pip超时问题
  14. Mysql语句商城系统表案例
  15. 实时数据库数据采集接口API八爪鱼采集接口
  16. 批规范化 Batch Normalization
  17. javaweb企业员工考勤管理系统案例
  18. 关于Context的理解(转)
  19. python用百度云接口实现身份证识别
  20. HM编码学习——数据处理与批处理

热门文章

  1. Android Studio错误代码汇总
  2. STM32 电机教程 12 - BLDC 闭环电流控制
  3. ubuntu常用小工具
  4. 准备入门IC的全局观念系列-下
  5. 【DIY】arduino播放音乐方案——TMRpcm
  6. 九 Deepin配置ssh访问gitee
  7. PIC单片机 IIC通信及实现
  8. 读CSS DIV网页样式与布局心得体会
  9. CentOS6.5 编译安装zabbix3.0.5,编译安装zabbix_agent客户端
  10. IT忍者神龟之Struts2.xml配置全然正确流程能走通可是有红叉解决