`

ListView中显示SD卡、数据库、网络图片

 
阅读更多

实现下图,图片来自SD卡、数据库、网络图片


 

定义一个ListView的xml(res/layout/list_view.xml)

 

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

Activity代码

 

public class MessageListActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.home);

		setViews();
	}
	private void setViews() {		
		ListView lv = (ListView)findViewById(R.id.h_list_view);
		SimpleAdapter adapter = new ImageSimpleAdapter(this, getDatas() ,R.layout.message_list
				, new String[]{"icon","title","shortContent"}, new int[]{R.id.ml_icon,R.id.ml_title,R.id.ml_short_content});
		lv.setAdapter(adapter);
		lv.setOnItemClickListener(new OnItemClickListener(){
			@Override
			public void onItemClick(AdapterView<?> av, View v, int position, long id) {
				//处理列表项的点击事件
			}
		});
	}
	private List<Map<String,Object>> getDatas() {
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		for (int i=1; i<=12; i++) {
			Map<String,Object> map = new HashMap<String,Object>();
			String imagePath = "/sdcard/image_0"+i+".jpg";
			if (i >= 10) imagePath = "/sdcard/image_"+i+".jpg";
			map.put("icon", BitmapFactory.decodeFile(imagePath));
			map.put("title", "My Title "+i);
			map.put("shortContent", "my short content "+i);
			list.add(map);
		}
		return list;
	}
}
 

 

SimpleAdapter中能放置drawable中的图片,如果想放置其它来源的图片(如:SD卡、数据库、网络图片),那么需要重写它的bindView方法,这是个private方法,因此还需要重写所以调用它的方法。

 

package com.example.adapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class ImageSimpleAdapter extends SimpleAdapter {
	private int[] mTo;
    private String[] mFrom;
    private ViewBinder mViewBinder;
    private List<? extends Map<String, ?>> mData;
    private int mResource;
    private int mDropDownResource;
    private LayoutInflater mInflater;
	public ImageSimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
		super(context, data, resource, from, to);
		mTo = to;
		mFrom = from;
		mData = data;
		mResource = mDropDownResource = resource;
		mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(position, convertView, parent, mResource);
    }
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(position, convertView, parent, mDropDownResource);
    }
	private View createViewFromResource(int position, View convertView,
            ViewGroup parent, int resource) {
        View v;
        if (convertView == null) {
            v = mInflater.inflate(resource, parent, false);
        } else {
            v = convertView;
        }

        bindView(position, v);

        return v;
    }
	private void bindView(int position, View view) {
		final Map dataSet = mData.get(position);
        if (dataSet == null) {
            return;
        }

        final ViewBinder binder = mViewBinder;
        final String[] from = mFrom;
        final int[] to = mTo;
        final int count = to.length;

        for (int i = 0; i < count; i++) {
            final View v = view.findViewById(to[i]);
            if (v != null) {
                final Object data = dataSet.get(from[i]);
                String text = data == null ? "" : data.toString();
                if (text == null) {
                    text = "";
                }

                boolean bound = false;
                if (binder != null) {
                    bound = binder.setViewValue(v, data, text);
                }

                if (!bound) {
                    if (v instanceof Checkable) {
                        if (data instanceof Boolean) {
                            ((Checkable) v).setChecked((Boolean) data);
                        } else if (v instanceof TextView) {
                            // Note: keep the instanceof TextView check at the bottom of these
                            // ifs since a lot of views are TextViews (e.g. CheckBoxes).
                            setViewText((TextView) v, text);
                        } else {
                            throw new IllegalStateException(v.getClass().getName() +
                                    " should be bound to a Boolean, not a " +
                                    (data == null ? "<unknown type>" : data.getClass()));
                        }
                    } else if (v instanceof TextView) {
                        // Note: keep the instanceof TextView check at the bottom of these
                        // ifs since a lot of views are TextViews (e.g. CheckBoxes).
                        setViewText((TextView) v, text);
                    } else if (v instanceof ImageView) {
                        if (data instanceof Integer) {
                            setViewImage((ImageView) v, (Integer) data);
                        } else if (data instanceof Bitmap) {//仅仅添加这一步
                        	setViewImage((ImageView) v, (Bitmap)data);
                        } else {
                            setViewImage((ImageView) v, text);
                        }
                    } else {
                        throw new IllegalStateException(v.getClass().getName()
                                + " is not a view that can be bounds by this SimpleAdapter");
                    }
                }
            }
        }
	}
	/**
	 * 添加这个方法来处理Bitmap类型参数
	 * @param v
	 * @param bitmap
	 */
	public void setViewImage(ImageView v, Bitmap bitmap) {
		v.setImageBitmap(bitmap);
    }
}

 

使用这个类替代SimpleAdapter就可以放SD卡、数据库、网络图片了(先将图片转换成Bitmap

 

 

适配器布局(res/layout/message_list.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">
	<ImageView android:id="@+id/ml_icon"
		android:layout_width="50dp"
		android:layout_height="58dp"
		android:src="@drawable/ml_default_image"
		/>
	<LinearLayout
	  xmlns:android="http://schemas.android.com/apk/res/android"
	  android:orientation="vertical"
	  android:layout_width="match_parent"
	  android:layout_height="58dp"
	  android:layout_weight="1">
	  <TextView android:id="@+id/ml_title"
	  	android:layout_width="fill_parent"
	  	android:layout_height="25dp"
	  	android:textStyle="bold"
	  	android:textSize="20dp"
	  	/>
	  <TextView android:id="@+id/ml_short_content"
	  	android:layout_width="fill_parent"
	  	android:layout_height="35dp"
	  	/>
	</LinearLayout>
	<TextView
		android:layout_width="30dp"
		android:layout_height="58dp"
		android:text=">"
		android:textSize="26dp"
		android:layout_gravity="right"
		android:gravity="center"
		/>
</LinearLayout>
  • 大小: 14.3 KB
分享到:
评论

相关推荐

    把sd卡中的文件显示到ListView中

    在Android系统中,SD卡是用于扩展设备存储空间的一个重要组成部分,它允许用户存储大量数据,如音乐、图片、视频等。在这个特定的项目中,我们的目标是将SD卡中的MP3文件显示在一个ListView中。ListView是Android UI...

    android复制数据库到SD卡打开加载listview

    通过以上步骤,我们完成了从`assets`复制SQLite数据库到SD卡、打开数据库以及将数据库内容加载到ListView显示的过程。同时,还介绍了如何对ListView进行排序。在实际应用中,可能还需要处理更多细节,例如错误处理、...

    读取SDcard Database并在Android ListView显示的处理流程

    在Android开发中,将SD卡上的数据库数据读取并显示在ListView中是一个常见的需求,尤其在数据量较大、需要分页加载或者缓存数据时。这个过程涉及到Android系统的文件操作、SQLite数据库操作以及UI组件的使用。以下是...

    SQLite 存储在SD卡

    在本案例中,我们将讨论如何将 SQLite 数据库与 ListView 结合,并将数据库存储在 SD 卡上。 首先,我们来看如何在 Android 应用中创建和使用 SQLite 数据库。Android 提供了一个 SQLiteOpenHelper 的抽象类,它...

    android用存到缓存的方法来保存ListView里的数据

    数据在首次加载时从网络或本地文件读取,并存储到数据库中,后续请求直接从数据库读取。 7. **异步加载**:使用异步加载策略,比如`LoaderManager`或`AsyncTask`,可以在后台线程加载数据,然后通知UI更新,防止...

    listview优化和异步加载全攻略

    3. 缓存策略:对于需要加载图片或复杂视图的ListView,可以采用缓存机制,如软引用或LruCache,存储已经加载过的图片或视图,避免重复加载。 4. ListView的滚动监听:通过监听ListView的OnScrollListener,当用户...

    ListView性能优化

    同时,可以考虑将图片存储在手机的内部存储或SD卡上。 - **数据库查询缓存**:预先从数据库加载所有数据并缓存,减少后续的数据库查询。 4. **延时加载(懒加载)**: - 当ListView内容过多时,不一次性加载所有...

    Asp.net数据库开发实例

    在Asp.net数据库开发实例中,我们探讨的是如何利用ASP.NET这一强大的Web应用程序框架与数据库进行交互,以创建高效、动态的网站应用。ASP.NET是由微软公司开发的,它为开发者提供了一整套构建高性能、安全性和可伸缩...

    Android 读写文件和数据库(SQLite)

    1. **存储路径**:Android提供了多种存储文件的方式,包括内部存储、外部存储(公共和私有)以及外部SD卡。内部存储用于应用程序私有的数据,外部存储则允许其他应用访问。使用`getFilesDir()`获取内部存储的私有...

    Android通过LIstView显示文件列表的两种方法介绍

    本文将详细介绍两种在Android中通过ListView显示SD卡中文件列表的方法:一种是通过继承`ListActivity`,另一种是利用`BaseAdapter`。 1. **继承ListActivity的方法** 当你选择继承`ListActivity`时,系统会自动将...

    安卓音乐播放器相关-该Demo运行后会显示所有你sd卡上的音乐文件列表并可以点击列表选择某一首歌曲进行播放。.rar

    2. **文件系统访问**:Android设备上的外部存储(通常是SD卡)可以通过Environment.getExternalStorageDirectory()方法访问。开发者需要权限(READ_EXTERNAL_STORAGE)来读取SD卡上的文件。 3. **ListView与Adapter...

    查找SD卡上的音乐文件

    本篇文章将深入解析如何利用Android系统内置的功能来实现这一目标,包括使用SQLite数据库查询SD卡上的MP3文件信息,并展示如何通过编程手段获取这些信息。 ### 一、理解Android中的MediaStore 在Android系统中,`...

    基于android的多媒体播放器(服务端+客户端+数据库).zip

    9. **权限管理**:考虑到多媒体文件可能涉及到读取存储卡和网络访问,Android应用需要在Manifest.xml中声明相应的权限,如`READ_EXTERNAL_STORAGE`和`INTERNET`。 10. **异步处理**:在处理多媒体文件时,为避免...

    C# winform SQL server图片管理系统

    在数据库中存储图片有多种方式:直接存储二进制数据、存储图片的URL或文件路径。本系统采用存储二进制数据的方式,可以避免图片文件的物理位置变动导致的链接失效。这通常涉及使用SQL Server的VARBINARY(MAX)或BLOB...

    Android的相册,读取sdcard里的相片

    在加载图片的过程中,还要考虑用户体验,如加载动画、错误处理(如网络不佳或图片不存在时)以及加载进度显示。此外,对于大量图片的加载,应考虑分页加载,避免一次性加载过多数据导致性能问题。 总结来说,...

    Android简单的文件管理加杀毒 数据库是mysql

    例如,`Environment`类提供了访问外部存储(如SD卡)的方法,`File`类用于文件和目录的操作,如创建、读取、写入和删除。此外,`ContentResolver`和`DocumentsContract`类可用于更高级的文件操作,支持与系统文件...

    Android开发_2年工作经验Android软件工程师求职简历个人简历.pdf

    *EXTERNAL STORAGE (SD 卡)*:Android 中的一种数据存储方式,使用外部存储设备(如 SD 卡)来存储数据。 *SharedPreferences*:Android 中的一种轻量级数据存储方式,用于存储少量的数据。 *DATABASE*:Android 中...

    异步加载图片

    - Android提供了几种文件存储方式:内部存储、外部存储(SD卡)、SQLite数据库和ContentProvider。对于图片,通常使用外部存储,但需注意权限管理。 - 使用`Environment.getExternalStorageDirectory()`获取外部...

    Android应用源码之Gallery2_Android.zip

    Gallery2是一个针对Android平台的开源图片浏览应用,其源码为我们提供了一个深入理解Android系统中图片展示、手势操作以及图片库集成的实例。通过分析这个项目,我们可以学习到许多关于Android开发的重要知识点。 ...

    android 闹钟选择SD卡音乐铃声

    1. **多媒体文件访问**:Android系统允许应用程序访问外部存储(如SD卡)上的文件。首先,你需要在AndroidManifest.xml中申请读取外部存储的权限: ```xml ``` 2. **文件路径获取**:在Android中,可以通过`...

Global site tag (gtag.js) - Google Analytics