1.定义一个适配器extends BaseAdapter
public class MusicAdapter extends BaseAdapter{
2.添加相应的属性
private LayoutInflater mInflater;
private Context mContext;
private int mResouce;
private List<Music> mObjects;
3.重写BaseAdapter中的方法
public MusicAdapter(Context context,int resource,List<Music> musics) {
mContext=context;
//获得一个一个系统服务(此服务对应的对象可以解析xml,并通过反射构建xml对应的元素对象)
mInflater=(LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mResouce=resource;
mObjects=musics;
}
/**返回数据集中item数据的个数*/
@Override
public int getCount() {//重要
return mObjects.size();
}
/**返回对应位置的item中的数据*/
@Override
public Object getItem(int position) {
return mObjects.get(position);
}
/**暂且直接返回position*/
@Override
public long getItemId(int position) {
return position;
}
/**此方法用于构建item,每显示一个item都要执行一次此方法*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {//重要
Log.i("TAG", "convertView="+convertView);
Log.i("TAG", "parent="+parent);
//1.item view (饺子皮,饺子皮的样子由mResouce决定)
View v=null;
ViewHolder vHolder=null;
if(convertView==null){//页面启动时初始值为空
//inflate方法返回的类型由mResouce资源文件的根元素决定
//1)根据资源id找到对应的xml布局资源
//2)底层会借助pull解析解析xml资源
//3)底层会通过反射构建xml资源中的元素对象
//4)inflate方法的返回值为mResource资源文件的根元素对象
v=mInflater.inflate(mResouce,parent,false);
vHolder=new ViewHolder();
vHolder.sectionTv=(TextView) v.findViewById(R.id.sectionId);
vHolder.titleTv=(TextView) v.findViewById(android.R.id.text1);;
vHolder.createTv=(TextView) v.findViewById(android.R.id.text2);;
v.setTag(vHolder);//建立关联:相当于一个教室一个座位表
}else{
v=convertView;//可重用的item view对象
vHolder=(ViewHolder) v.getTag();
}
//2.item data (饺子馅)
Music m=mObjects.get(position);
//3.bind view (包饺子,对号入座,将饺子馅放到饺子皮上)
vHolder.sectionTv.setText(m.getTitle().substring(0, 1).toUpperCase());
vHolder.titleTv.setText(m.getTitle());
vHolder.createTv.setText(m.getCreated());
//4.设置item view背景(根据选中位置的不同进行设置)
int checked=((ListView)parent).
getCheckedItemPosition();
Log.i("TAG", "checked="+checked);
if(position==checked){
v.setBackgroundColor(Color.YELLOW);
}else{
v.setBackgroundColor(Color.WHITE);
}
//5.显示或隐藏item对应的section
int section=getSectionForPosition(position);
int minPos=getPositionForSection(section);
if(position==minPos){
vHolder.sectionTv.setVisibility(View.VISIBLE);
}else{
vHolder.sectionTv.setVisibility(View.GONE);
}
return v;//包好的饺子
}
4.里面有引用的其他部分的方法或者类
/**通过此方法获得每个位置的section的ascii值*/
public int getSectionForPosition(int position){
return mObjects.get(position).
getTitle().toUpperCase().charAt(0);
}
/***通过此方法获得section在列表中的最小位置*/
public int getPositionForSection(int section){
//1.遍历所有位置(0~getCount()-1)
for(int i=0;i<getCount();i++){
int findSec=getSectionForPosition(i);
if(findSec==section){
//2.找到最小位置
return i;
}
}
return -1;
}
class ViewHolder{
TextView sectionTv;
TextView titleTv;
TextView createTv;
}