android Adapter的用法說明

在使用ListView或是GridView時,會使用到Adapter來定義View的內容,最簡單的方式如下:


ListView listview = (ListView) findViewById(R.id.listview);
//ListView 要顯示的內容
String[] str = {"新北市","台北市","台中市","台南市","高雄市"};
//android.R.layout.simple_list_item_1 為內建樣式,還有其他樣式可自行研究
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
str);
listview.setAdapter(adapter);


但我們通常不會只想要List或是Grid裡面只有一個TextView的,所以這邊必須要自定義一個Adapter來使用。

例如:



package com.example.mp3list;
import com.example.mp3list.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MusicGridAdapter extends BaseAdapter {
private Context context;
private List<MusicInfo> musicInfos;
private MusicInfo musicInfo;
private ArrayList<Bitmap> album_cover_list;
/**
* 构造函数
* @param context 上下文
* @param mp3Infos 集合对象
*/
public MusicGridAdapter(Context context, List<MusicInfo> mp3Infos, ArrayList<Bitmap> bit) {
this.context = context;
this.musicInfos = mp3Infos;
this.album_cover_list = bit;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return musicInfos.size();
}
@Override
public MusicInfo getItem(int position) {
// TODO Auto-generated method stub
return this.musicInfos.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MusicGridAdapter.ViewHolder viewHolder = null;
if(convertView == null)
{
viewHolder = new MusicGridAdapter.ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.grid, null);
viewHolder.musicTitle = (TextView) convertView.findViewById(R.id.grid_title);
viewHolder.albumImage = (ImageView) convertView.findViewById(R.id.grid_cd);
viewHolder.musicArtist = (TextView) convertView.findViewById(R.id.grid_art);
convertView.setTag(viewHolder); //表示给View添加一个格外的数据,
} else {
viewHolder = (MusicGridAdapter.ViewHolder)convertView.getTag();//通过getTag的方法将数据取出来
}
musicInfo = musicInfos.get(position);
viewHolder.musicTitle.setText(musicInfo.getTitle()); //显示标题
viewHolder.musicArtist.setText(musicInfo.getArtist()); //显示艺术家
viewHolder.albumImage.setImageBitmap(album_cover_list.get(position));//显示bit
return convertView;
}
/**
* 定义一个内部类
* 声明相应的控件引用
*
*/
public class ViewHolder {
//所有控件对象引用
public ImageView albumImage; //专辑图片
public TextView musicTitle; //音乐标题
public TextView musicDuration; //音乐时长
public TextView musicArtist; //音乐艺术家
}
}







最基本的adapter必須具備這樣的一個架構,而我們可以從convertView = LayoutInflater.from(context).inflate(R.layout.grid, null);

去定義R.layout.grid去修改顯示的內容


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffff">
<ImageView
android:id="@+id/grid_cd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/cd_example"/>
<TextView
android:id="@+id/grid_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/grid_cd"
android:singleLine="true"
android:text="title"
android:textSize="15dp" />
<TextView
android:id="@+id/grid_art"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/grid_title"
android:textSize="10dp"
android:singleLine="true"
android:text="art" />
</RelativeLayout>
view raw grid.xml hosted with ❤ by GitHub
最後的結果:

留言

這個網誌中的熱門文章

android service作法

android app之間使用socket做溝通

html css & bootstrap心得