android ——ListView
谷歌官方文档的介绍:https://developer.android.com/reference/android/widget/ListView.html
显示可垂直滚动的视图集合,其中每个视图都立即位于列表中的上一个视图的下方。 为了更现代化,更灵活和更有效地显示列表,请使用RecyclerView。。。
现在活动布局中加入ListView:
<?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="vertical"> <ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>
这里做一个定制的列表,就是自己定制列表中的布局。新建一个hero_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/hero_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <TextView
android:id="@+id/hero_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="20sp"/> </LinearLayout>
再然后是这次想要使用的数据,http://ow.blizzard.cn/heroes/,数据来自暴雪的守望先锋官网的英雄介绍页面

旁边的html代码中<img src="..." class="portrait">是英雄头像的url,</span><span class="portrait-title">末日铁拳</span></span>是英雄的名字。
所以新建一个H
public class Hero {
private String imageUrl;
private String name;
public Hero(String imageUrl, String name) {
this.imageUrl = imageUrl;
this.name = name;
}
public String getUrl() {
return imageUrl;
}
public void setUrl(String url) {
this.imageUrl = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后就是ListView的Adapter,新建一个HeroAdapter.class,这个Adapter继承自ArrayAdapter,并将泛型指定为Hero
public class HeroAdapter extends ArrayAdapter<Hero> {
private int resourceId;
public HeroAdapter(Context context, int textViewResourceId, List<Hero> objects){
super(context,textViewResourceId,objects);
resourceId = textViewResourceId;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Hero hero = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView heroImg = (ImageView) view.findViewById(R.id.hero_img);
TextView heroName = (TextView) view.findViewById(R.id.hero_name);
Glide.with(getContext()).load(hero.getUrl()).into(heroImg);
heroName.setText(hero.getName());
return view;
}
}
HeroAdapter重写了父类的构造函数,可以获得上下文,ListView的子布局的id和数据,然后重写getView()方法,这个方法会在每个子项被滚动到屏幕时调用,在getItem()中根据position获得当前的Hero实例,然后使用LayoutInflater来为这个子项加载布局,再然后设置布局中的ImageView 和TextView,最后返回布局。
最后活动中的代码
public class MainActivity extends AppCompatActivity {
private List<Hero> heroList = new ArrayList<>();
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(R.id.list_view);
initHeroes();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
HeroAdapter adapter = new HeroAdapter(MainActivity.this, R.layout.hero_item, heroList);
listView.setAdapter(adapter);
}
}
};
}
//读取数据
private void initHeroes(){
String weatherUrl = "http://ow.blizzard.cn/heroes/";
HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseText = response.body().string();
new Thread(new Runnable() {
@Override
public void run() {
Document doc = Jsoup.parse(responseText);//将String类型的html转换为Document
Elements elements1 = doc.select(".portrait"); //读取图片url
Elements elements2 = doc.select(".portrait-title");//读取英雄名字
for (int j = 0; j < elements1.size(); j++) {
Hero hero = new Hero(elements1.get(j).attr("src"), elements2.get(j).text());
heroList.add(hero);
}
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}).start();
}
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "数据获取失败", Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
创建一个HeroAdapter,传入上下文,子布局和数据,再将这个适配器传递给ListView就好了

代码优化:
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Hero hero = getItem(position);
View view;
ViewHolder viewholder;
//检验之前是否已经加载好布局
if(convertView != null) {
view = convertView;
viewholder = (ViewHolder) view.getTag();
}else {
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
viewholder = new ViewHolder();
viewholder.heroImg = (ImageView) view.findViewById(R.id.hero_img);
viewholder.heroName = (TextView) view.findViewById(R.id.hero_name);
view.setTag(viewholder);
}
Glide.with(getContext()).load(hero.getUrl()).into(viewholder.heroImg);
viewholder.heroName.setText(hero.getName());
return view;
}
class ViewHolder{
ImageView heroImg;
TextView heroName;
}
}
根据如果之前加载过的布局就重用之前的,不再使用LayoutInflater去加载布局,然后还把之前获取的布局控件的id也保存了下来。这样做的话。。像这次这样简单的布局和数据就有点加载得快过头了。。。
ListView的点击事件
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(R.id.list_view);
....
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Hero hero = heroList.get(i);
Toast.makeText(MainActivity.this,hero.getName(),Toast.LENGTH_SHORT).show();
}
});
}
android ——ListView的更多相关文章
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- Android ListView onItemClick Not Work
Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...
- Android ListView 常用技巧
Android ListView 常用技巧 Android TextView 常用技巧 1.使用ViewHolder提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每 ...
- Android listview addHeaderView 和 addFooterView 详解
addHeaderView()方法:主要是向listView的头部添加布局addFooterView()方法:主要是向listView的底部添加布局 需要注意的是添加布局的时候应该添加从父容器开始添加 ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- Android --ListView分页
参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implemen ...
- Android ListView ListActivity PreferenceActivity背景变黑的问题ZT
Android ListView ListActivity PreferenceActivity背景变黑的问题 ListView在滚动时背景会变暗甚至变黑,这个要从Listview的效果说起,默认的L ...
- android listview去掉分割线
1:android listview去掉分割线 1>设置android:divider="@null" 2>android:divider="#0000000 ...
- 【转】android ListView 几个重要属性
android ListView 几个重要属性 分类: Android2012-03-08 19:25 19324人阅读 评论(5) 收藏 举报 listviewandroid活动javalistnu ...
随机推荐
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- 1. 全文搜索框架 Haystack
1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...
- Java SpringBoot 如何使用 IdentityServer4 作为验证学习笔记
这边记录下如何使用IdentityServer4 作为 Java SpringBoot 的 认证服务器和令牌颁发服务器.本人也是新手,所以理解不足的地方请多多指教.另外由于真的很久没有写中文了,用词不 ...
- 浅谈tomcat 、apache、 nginx的区别及优缺点
(~~排版垃圾~~,此文纪念自己18年6月所作为,如有不适合之处,请告知.) 本文主要说明tomcat .apache. nginx的定义.区别及优缺点 一. 定义: 1. Apache Apache ...
- RabbitMQ从入门到精通(三)
目录 1. 自定义消费者使用 自定义消费端演示 2.消费端的限流策略 2.1 限流的场景与机制 2.2 限流相关API 2.3 限流演示 3. 消费端ACK与重回队列机制 3.1 ACK与NACK 3 ...
- AndroidStudio使用genymotion模拟器
安装Genymotion之前首先要安装好virtualbox这个软件 virtual官方网站:https://www.virtualbox.org/ genymotion的官方网站: https:// ...
- C#3.0新增功能09 LINQ 标准查询运算符 02 查询表达式语法
连载目录 [已更新最新开发文章,点击查看详细] 某些使用更频繁的标准查询运算符具有专用的 C# 语言关键字语法,使用这些语法可以在查询表达式中调用这些运算符. 查询表达式是比基于方法的等效项更具 ...
- 端口,OSI7层模型,TCP的三次握手和四次挥手,进度条
1.端口: 端口是为了将同一个电脑上的不同程序进行隔离 IP是找电脑,端口是找电脑上的程序 MySQL是一个软件,帮助我们在硬盘上进行文件操作,默认端口是3306 Redis是一个软件,帮助我们在内存 ...
- SQLyog 破解版
百度云:链接:http://pan.baidu.com/s/1eSMEzIE 密码:ubi2
- [学习笔记] NumPy走一趟(持续更)
Numpy学习笔记 之前没有花时间去专门学Numpy,都是用到什么就草草查一下,最近在学DeepLearning,就决定还是系统地把Numpy学一遍. 一.Numpy基础篇 https://www.r ...