通过上面的分析可以看见其实对于Header的adapter核心就是setListAdapter(new HeaderAdapter(this, mHeaders));这句代码。那我们就来看看这个内部类HeaderAdapter,源码如下:
//可以发现PreferenceActivity的内部类HeaderAdapter是继承自ArrayAdapter的,
//这个Adapter就是用来给推荐的Header list的listview提供数据的。
private static class HeaderAdapter extends ArrayAdapter<Header> {
//Holder里只有最典型经典的三个组件
private static class HeaderViewHolder {
ImageView icon;
TextView title;
TextView summary;
}
private LayoutInflater mInflater;
//构造方法,不解释
public HeaderAdapter(Context context, List<Header> objects) {
super(context, 0, objects);
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//最最核心方法!!!!!!Header list被显示到PreferenceActivity的listview关键点
@Override
public View getView(int position, View convertView, ViewGroup parent) {
HeaderViewHolder holder;
View view;
//再常见不过的Adapter数据加载ViewHolder写法了
if (convertView == null) {
//加载header的item布局,都是用的preference_header_item文件,如下会介绍
view = mInflater.inflate(com.android.internal.R.layout.preference_header_item,
parent, false);
holder = new HeaderViewHolder();
holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon);
holder.title = (TextView) view.findViewById(com.android.internal.R.id.title);
holder.summary = (TextView) view.findViewById(com.android.internal.R.id.summary);
view.setTag(holder);
} else {
view = convertView;
holder = (HeaderViewHolder) view.getTag();
}
//一堆显示,通过getItem(position)拿到构造里传入的List<Header>类型objects的item
// All view fields must be updated every time, because the view may be recycled
Header header = getItem(position);
holder.icon.setImageResource(header.iconRes);
holder.title.setText(header.getTitle(getContext().getResources()));
CharSequence summary = header.getSummary(getContext().getResources());
if (!TextUtils.isEmpty(summary)) {
holder.summary.setVisibility(View.VISIBLE);
holder.summary.setText(summary);
} else {
holder.summary.setVisibility(View.GONE);
}
return view;
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49639-9.html
成功了