`
coolxing
  • 浏览: 874169 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:97281
社区版块
存档分类
最新评论

android笔记--在ListView中显示图片及ListView的动态刷新

阅读更多

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

 

最近在做一个天气预报的小课题, 其中涉及到了ListView的动态刷新, 以及如何在ListView上显示图片.

 

1. 在ListView上显示图片.

为了实现这个功能, 首先需要定义一个布局文件, 用于显示ListView的每个Item. 比如list_item.xml:

 

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

	<ImageView android:id="@+id/list_image"
		android:layout_marginTop="6px" android:layout_marginBottom="6px"
		android:layout_marginLeft="6px" android:layout_marginRight="6px"
		android:layout_width="wrap_content" android:layout_height="wrap_content" />
	<TextView android:id="@+id/list_text"
		android:layout_marginLeft="6px" android:layout_marginRight="6px" android:layout_gravity="center_vertical"
		android:layout_width="fill_parent" android:layout_height="wrap_content" />

</LinearLayout>

 

接下来需要选择一个合适的adapter, 由于系统提供的adapter都无法满足显示图片的需求(这点我并不确定), 因此在这里我自定义了一个BaseAdapter的子类:

 

public class MyListAdapter extends BaseAdapter {
	private Activity context;
	private List<WeatherInfomation> list;

	public MyListAdapter(Activity context, List<WeatherInfomation> list) {
		this.context = context;
		this.list = list;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		LayoutInflater inflater = context.getLayoutInflater();
		View itemView = inflater.inflate(R.layout.list_item, null);
		WeatherInfomation info = list.get(position);
		TextView textView = (TextView) itemView.findViewById(R.id.list_text);
		ImageView imageView = (ImageView) itemView
				.findViewById(R.id.list_image);
		textView.setText(info.getWeatherText());
		imageView.setImageBitmap(info.getWeatherBitmap());
		return itemView;
	}

	@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;
	}
}

可以看到, 定义BaseAdapter的子类需要重写很多方法, 其他方法都不难, 关键就是getView()方法. getView()方法返回的itemView对象用来显示ListView的一个Item. 使用LayoutInflater类的inflater方法可以从ist_item.xml文件中解析出itemView对象, 但此时不可直接将itemView返回, 还需定义itemView中的ImageView和TextView的行为. 可以将itemView理解为ImageView和TextView的父控件. 源文件中涉及的WeatherInfomation是我定义的一个实体类, 代码如下:

 

public class WeatherInfomation {
	/**
	 * 代表天气状况的图片
	 */
	private Bitmap weatherBitmap;
	/**
	 * 具体天气的文字说明
	 */
	private String weatherText;

	public WeatherInfomation(Bitmap weatherBitmap, String weatherText) {
		super();
		this.weatherBitmap = weatherBitmap;
		this.weatherText = weatherText;
	}

	public Bitmap getWeatherBitmap() {
		return weatherBitmap;
	}

	public void setWeatherBitmap(Bitmap weatherBitmap) {
		this.weatherBitmap = weatherBitmap;
	}

	public String getWeatherText() {
		return weatherText;
	}

	public void setWeatherText(String weatherText) {
		this.weatherText = weatherText;
	}

}

 接下来只需要创建出MyListAdapter对象并调用listview的setAdapter()方法就可以:

 

infomations = new ArrayList<WeatherInfomation>();
		myListAdapter = new MyListAdapter(MainActivity.this, infomations);
		listView.setAdapter(myListAdapter);

 这样就可以在listview上显示图片了.

 

2. 很多朋友都知道, 想要动态刷新listview中的内容, 只要调用在数据发生改变之后调用adapter的notifyDataSetChanged()方法就可以了. 这里需要注意的是所谓的"数据发生改变"到底指的是什么, 比如说如下的代码:

 

infomations = new ArrayList<WeatherInfomation>();
infomations.add(new WeatherInfomation());

 此时是否满足发生了数据改变的情形? 其实是没有的!(这个问题导致我浪费了很长时间, 我怎么花了一天时间才找出无法动态刷新listview的原因, 希望可以让看到的朋友避免这个问题). adapter在android中属于MVC中的mode, 它是UI界面和数据之间的桥梁, 而此时的数据, 并不是只infomations, 而是infomations这个引用所指向的WeatherInfomation集合, 因此重新创建一个 ArrayList<WeatherInfomation>并将其赋值给infomations改变的只是infomations的值,

而adapter关联的数据并没有发生变化. 后来我的处理代码是:

 

infomations.clear();
infomations.add(new WeatherInfomation());

 这样就真正改变了adapter所关联的数据了.

 

 

0
3
分享到:
评论
5 楼 chokee 2014-12-24  
又是没效果图的示例
4 楼 atgoingguoat 2014-04-16  
又是没效果图的示例。
3 楼 朝野布告 2013-10-20  
Useful,thx~
2 楼 573842281 2012-02-22  
我也遇到过类似的问题,但我是重新获取数据,然后setAdapter了。
1 楼 yancewong 2012-01-13  
不对吧。。直接往上面add也可以触发刷新的。。

相关推荐

    Android ListView下拉刷新 Demo.zip

    本教程将详细讲解如何在Android中实现ListView的下拉刷新功能,主要围绕"Android ListView下拉刷新 Demo.zip"这个压缩包中的示例代码进行讲解。 首先,下拉刷新功能通常是通过第三方库来实现的,如...

    Android开发笔记之:ListView刷新顺序的问题详解

    在Android开发中,ListView是一个非常常用的组件,它用于展示大量数据列表。然而,ListView的刷新顺序问题是一个开发者常遇到的挑战,特别是在实现动态更新和交互功能时。本篇笔记将深入探讨这个问题,以及如何优雅...

    listview的小demo

    在Android中,我们通常使用Adapter来连接ListView和数据源,Adapter负责将数据转化为列表项视图并将其添加到ListView中。 二、ListView的布局 1. Item布局:每个列表项视图的布局文件通常是一个XML布局,定义了列表...

    Android笔记本APP源码.zip

    - **Adapter**: 如`NotesAdapter`,将数据库中的笔记数据绑定到ListView或RecyclerView上,实现列表的动态显示。 - **SharedPreferences**: 可能用于存储用户偏好设置,如主题颜色、字体大小等。 - **通知与同步...

    Android ListView常见

    在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。它的高效性和可定制性使得它在各种应用中广泛应用。本篇笔记将深入探讨ListView的使用、自定义及优化,结合源码分析,帮助你更好地理解和...

    ANDROID学习笔记4

    在Android开发中,`ListView`是一种非常重要的UI组件,它能够显示一个可以滚动的列表,支持单选或多选模式。本节将详细介绍`ListView`的基本用法、自定义适配器以及一些实用的扩展技巧。 ##### 1. ListView基本概念...

    Android应用开发_学习笔记.doc

    【Android应用开发学习笔记】 Android应用开发是移动设备软件开发的重要组成部分,主要涉及四大组件、UI设计以及系统交互。本文将深入探讨这些关键知识点。 **一、Android四大组件** 1. **Activity(活动)** - ...

    Android-PullToRefresh 的library

    Android-PullToRefresh 是一个专为Android平台设计的下拉刷新库,它使得开发者能够轻松地在应用中实现上拉加载更多以及下拉刷新的功能。这个库由Jeff Gilfelt 创建,后来被Android社区广泛采用并持续优化。在Android...

    android 整理代码笔记

    2. **ListView**: ListView是Android中常用的控件,用于显示大量可滚动的数据列表。开发者通常需要自定义适配器(Adapter)来绑定数据,并处理item点击事件和滑动刷新等交互功能。 3. **Client**: 在Android中,...

    Android笔记

    【Android笔记】是一份全面的学习资源,旨在帮助初学者掌握Android应用开发的核心概念和技术。这份资料涵盖了许多关键领域,从基础到进阶,为开发者提供了一个系统性的学习路径。 首先,【Android介绍】部分通常会...

    Android 局域网简易云端笔记系统源码.rar

    这是一个关于Android局域网云端笔记系统的源码项目,旨在帮助开发者了解如何在Android平台上构建一个简单但实用的云笔记应用,特别关注局域网内的数据同步功能。通过这个项目,我们可以学习到以下几个关键知识点: ...

    Android下拉刷新ListView——RTPullListView(demo)

    之前在我的文章《IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新》中介绍过如何在IOS上实现下拉刷新的功能。今天主要介绍下在Android上实现下拉刷新的Demo,下拉控件参考自Github上开源项目PullToRefresh,并...

    Android笔记之:App列表之下拉刷新的使用

    在本篇笔记中,我们将探讨如何在ListView中实现下拉刷新功能,这是许多应用程序,如微博和资讯类应用,常用的一种交互设计。 下拉刷新的基本流程包括以下几个步骤: 1. **下拉显示头部**:当用户开始下拉ListView...

    android 入门笔记

    动态数据加载到下拉框,可以通过在Adapter的构造函数中传入动态数据源,然后在适配器中刷新数据,使下拉框内容发生变化。 以上是Android入门的一些基础知识点,涵盖了开发环境配置、应用程序组件、数据交互等多个...

    带时间的自定义刷新

    在Android开发中,"带时间的自定义刷新"通常指的是实现一种可定制化的下拉刷新功能,该功能不仅包括常见的刷新动画,还显示了具体的刷新时间,为用户提供更直观的操作反馈。这种功能常用于列表视图(ListView)或...

    Memoire.rar

    在备忘录应用中,我们通常会用ListView来显示用户的笔记列表。Adapter则是连接数据源与ListView的桥梁,它负责将数据转化为ListView可以显示的视图。在"Memoire"应用中,我们需要创建一个自定义的Adapter,继承自...

    note记事本

    "note记事本"是一个基于安卓平台的简单应用示例,旨在帮助初学者理解如何在Android环境中实现SQLite数据库操作和ListView的使用。SQLite是Android系统内置的轻量级数据库,常用于存储应用内的结构化数据,如用户设置...

    Android学习笔记(三二):线程:后台异步任务AsyncTask.doc

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制,它简化了在主线程和工作线程之间交互的过程。在Android中,由于UI操作必须在主线程中进行,因此需要异步处理来避免阻塞用户界面。AsyncTask就是...

Global site tag (gtag.js) - Google Analytics