在ListView中显示图片及ListView的动态刷新
来源:互联网 发布:139邮箱 ssl端口 编辑:程序博客网 时间:2024/05/21 13:55
最近在做一个天气预报的小课题, 其中涉及到了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>
<?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;
- }
- }
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;}@Overridepublic 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic 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;
- }
- }
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);
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());
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());
infomations.clear();infomations.add(new WeatherInfomation());
这样就真正改变了adapter所关联的数据了.
- 在ListView中显示图片及ListView的动态刷新
- android笔记--在ListView中显示图片及ListView的动态刷新
- 如何动态刷新ListView的显示---notifyDataSetChanged
- Android 自定义ListView + Gallery 组合,在ListView的一个item中显示多张图片
- EditText动态的刷新Listview显示查询结果
- 记录开发中listview的动态显示
- ListView中显示网络图片
- Android基础篇之在ListView中显示网络图片
- 通过SimpleAdapter直接在ListView中显示图片
- Android基础篇之在ListView中显示网络图片
- ListView内容动态刷新
- ListView动态刷新
- notifyDataSetChanged 动态刷新listview
- ListView数据动态刷新
- ListView动态刷新
- JQueryMobile listview动态刷新
- 动态刷新Listview
- ListView数据动态刷新
- 国内十大开源linux社区
- 深入android
- 这些书你看过了多少?
- Delphi中判断字母与汉字
- 设计Qt风格的C++API
- 在ListView中显示图片及ListView的动态刷新
- ctags使用
- opencv图像处理7-打开大图
- 做listview+上下拉动在header和footer
- 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创]
- 使用make更新静态库文件[转载]
- html文件中flash格式(flv、swf)文件的嵌入
- 浅析Android线程模型
- 计算机会议排名:Computer Science Conference Rankings- -