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

AndroidListView是比较常用的控件,但一直都觉得创建ListView步骤有点繁琐,故在此总结一下,方便查阅。程序效果是实现一个显示联系人的简单信息。使用ListView控件,数据有姓名,和照片,并加入点击事件响应。

布局文件:

  1.  
    <?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());

            }

        }

    }

 
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值