Android ListView控件显示数据库中图片

来源:互联网 发布:淘宝差评师曝光台官网 编辑:程序博客网 时间:2024/05/19 16:07
AndroidListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅。程序效果是实现一个显示联系人的简单信息。使用ListView控件,数据有姓名,和照片,并加入点击事件响应。

布局文件:

     
    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="?android:attr/listPreferredItemHeight">               <ImageView android:id="@+id/photo"        android:layout_width="80dip"        android:layout_height="20dip"        android:layout_alignParentTop="true"        android:layout_alignParentBottom="true"        android:adjustViewBounds="true"        android:padding="2dip" />    <TextView android:id="@+id/name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@+id/photo"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:singleLine="true"        android:ellipsize="marquee"        android:textSize="20dip" />   </RelativeLayout> 

在SimpleAdapter中需要一个数据源,用来存储数据的,在显示图片时我们要用HashMap<>存储一个Bitmap;但仅存取了Bitmap时在ListView中是无法显示图片的,我们需要对SimpleAdapter进行处理 。

如下是对SimpleAdaptr处理的主要代码:

java代码片段:

 
     adapter.setViewBinder(new ViewBinder (){          publicboolean setViewValue(View view, Object data,String textRepresentation){                 if(view instanceof ImageView && data instanceof Bitmap){                        ImageView iv = (ImageView) view;                        iv.setImageBitmap((Bitmap)data);                        returntrue;                  }else{                        returnfalse;                    }                }        });


可以使用Android.widget.SimpleAdapter.ViewBinder()方法来处理SimpleAdapter不直接支持的数据;
 完整代码:
    import com.ielims.DB.Database;     import android.app.ListActivity;    import android.database.Cursor;    import android.database.sqlite.SQLiteDatabase;    import android.graphics.Bitmap;    import android.graphics.BitmapFactory;    import android.os.Bundle;    import android.view.View;    import android.widget.AdapterView;    import android.widget.ImageView;    import android.widget.ListView;    import android.widget.SimpleAdapter;     import android.widget.SimpleAdapter.ViewBinder;       import android.widget.Toast;    import android.widget.AdapterView.OnItemClickListener;    import java.util.ArrayList;    import java.util.HashMap;    import java.util.Map;         publicclass Frm_Frends extends ListActivity {             private String[] mListRoleName = { };        ListView mListView = null;             ArrayList<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();;             @Override        protectedvoid onCreate(Bundle savedInstanceState) {            mListView = getListView();            GetCommonUsers();  //获取本地数据库Role表中用户信息                 SimpleAdapter adapter = new SimpleAdapter(this, mData, R.layout.frends,                    new String[] {                            "photo", "name"                    }, newint[] {                            R.id.photo, R.id.name                    });               adapter.setViewBinder(new ViewBinder (){                publicboolean setViewValue(View view, Object data,String textRepresentation){                    if(view instanceof ImageView && data instanceof Bitmap){                        ImageView iv = (ImageView) view;                        iv.setImageBitmap((Bitmap)data);                        returntrue;                    }else{                        returnfalse;                    }                }            });            setListAdapter(adapter);                 mListView.setOnItemClickListener(new OnItemClickListener() {                //处理点击事件                publicvoid onItemClick(AdapterView<?> adapterView, View view, int position, long id) {                    Toast.makeText(Frm_Frends.this, "您选择了 " +  mListRoleName[position],                            Toast.LENGTH_SHORT).show();                }            });             super.onCreate(savedInstanceState);        }             /**         * 获取本地数据库Role表中用户信息         */        protectedvoid GetCommonUsers()        {            String tbName = "Role";            //读取Role表中的用户姓名(name) 和照片(photo)两列信息            String[] col =new String[]{ "name", "photo"};                     SQLiteDatabase database = (new Database(this)).openDatabase();            Cursor cursor = database.query(tbName, col, null, null, null, null, null);            int num = cursor.getCount();             if (num > 0) {                mListRoleName = new String[num];                int index = 0;                String eName = "";                byte[] imgArr = null;                Bitmap photo = null;                // 必须使用moveToFirst方法将记录指针移动到第1条记录的位置                cursor.moveToFirst();                do {                    eName = cursor.getString(cursor.getColumnIndex("name"));                                    mListRoleName[index++] = eName;                     imgArr = cursor.getBlob(cursor.getColumnIndex("photo"));                    Map<String, Object> item = new HashMap<String, Object>();                    if(null != imgArr && imgArr.length > 0){                        photo = BitmapFactory.decodeByteArray(imgArr, 0, imgArr.length);                        item.put("photo", photo);                    }                    else{ //如果用户没有上传头像资源,就用默认图标代替                        item.put("photo", R.drawable.icon);                    }                     item.put("name", eName);                    mData.add(item);                } while (cursor.moveToNext());            }        }    }

 
运行结果:
原创粉丝点击