抽取的思路
1 抽取Adapter 共性的方法 2 把getView方法里 和holder相关的逻辑 摘取到Holder代码中 3 把Holder 相关的代码 抽取到BaseHolder中 4 把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder
HomeFragment和SubjectFragment二者的Adapter中很多共性的地方可以直接抽取出来,利用泛型,将数据封装,不同的bean的显示都封装在一起,由于使用了ViewHolder,在getView的时候都会创建new ViewHolder(),先将ViewHolder的数据提取出来
HomeFragment.java封装之前
package com.ldw.market.fragment; import java.util.List; import android.os.Bundle; import android.text.format.Formatter; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.RatingBar; import android.widget.TextView; import com.ldw.market.R; import com.ldw.market.domain.AppInfo; import com.ldw.market.http.HttpHelper; import com.ldw.market.protocol.HomeProtocal; import com.ldw.market.utils.UiUtils; import com.ldw.market.utils.BitmapHelper; import com.ldw.market.view.BaseListView; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.bitmap.PauseOnScrollListener; /* * Home页面,主体的加载的几个页面和服务器请求数据都是在BaseFragment中去实现 */ public class HomeFragment extends BaseFragment { private List<AppInfo> appInfos; // 当Fragment挂载的activity创建的时候调用 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); show(); } public View createSuccessView() { //使用自定义的ListView,ListView初始化的时候会初始化几个方法 BaseListView listView = new BaseListView(UiUtils.getContext()); listView.setAdapter(new HomeAdapter()); // 第二个参数 慢慢滑动的时候是否加载图片 false 加载 true 不加载 // 第三个参数 飞速滑动的时候是否加载图片 true 不加载 listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true)); bitmapUtils.configDefaultLoadingImage(R.drawable.ic_default); // 设置如果图片加载中显示的图片 bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_default);// 加载失败显示的图片 return listView; } private class HomeAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return appInfos.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return appInfos.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; if(convertView == null){ view = View.inflate(UiUtils.getContext(), R.layout.item_app, null); holder = new ViewHolder(); holder.item_icon = (ImageView) view.findViewById(R.id.item_icon); holder.item_title = (TextView) view.findViewById(R.id.item_title); holder.item_size = (TextView) view.findViewById(R.id.item_size); holder.item_bottom = (TextView) view.findViewById(R.id.item_bottom); holder.item_rating = (RatingBar) view.findViewById(R.id.item_rating); view.setTag(holder); }else{ //复用view view = convertView; holder = (ViewHolder) view.getTag(); } AppInfo appInfo = appInfos.get(position); holder.item_title.setText(appInfo.getName());// 设置应用程序的名字 String size = Formatter.formatFileSize(UiUtils.getContext(), appInfo.getSize()); holder.item_size.setText(size); holder.item_bottom.setText(appInfo.getDes()); float stars = appInfo.getStars(); holder.item_rating.setRating(stars); // 设置ratingBar的值 String iconUrl = appInfo.getIconUrl(); //这个地址不全,需要加上apache地址"iconUrl": "app/com.youyuan.yyhl/icon.jpg", //http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg //第一个参数是显示图片的控件,第二个参数是显示图片的url bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl); // 显示图片的控件 //bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl); return view; } } static class ViewHolder{ ImageView item_icon; TextView item_title,item_size,item_bottom; RatingBar item_rating; } @Override public LoadResult load() { HomeProtocal protocol = new HomeProtocal(); appInfos = protocol.load(0); return checkData(appInfos); } } 提取以后 package com.ldw.market.fragment; import java.util.List; import android.os.Bundle; import android.text.format.Formatter; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.RatingBar; import android.widget.TextView; import com.ldw.market.R; import com.ldw.market.Adapter.DefaultAdapter; import com.ldw.market.domain.AppInfo; import com.ldw.market.http.HttpHelper; import com.ldw.market.protocol.HomeProtocal; import com.ldw.market.utils.UiUtils; import com.ldw.market.utils.BitmapHelper; import com.ldw.market.view.BaseListView; import com.lidroid.xutils.BitmapUtils; import com.lidroid.xutils.bitmap.PauseOnScrollListener; /* * Home页面,主体的加载的几个页面和服务器请求数据都是在BaseFragment中去实现 */ public class HomeFragment extends BaseFragment { private List<AppInfo> appInfos; // 当Fragment挂载的activity创建的时候调用 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); show(); } public View createSuccessView() { //使用自定义的ListView,ListView初始化的时候会初始化几个方法 BaseListView listView = new BaseListView(UiUtils.getContext()); listView.setAdapter(new HomeAdapter(appInfos)); // 第二个参数 慢慢滑动的时候是否加载图片 false 加载 true 不加载 // 第三个参数 飞速滑动的时候是否加载图片 true 不加载 listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true)); bitmapUtils.configDefaultLoadingImage(R.drawable.ic_default); // 设置如果图片加载中显示的图片 bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_default);// 加载失败显示的图片 return listView; } private class HomeAdapter extends DefaultAdapter<AppInfo>{ //构造函数,初始化数据 public HomeAdapter(List<AppInfo> appInfos) { super(appInfos); // TODO Auto-generated constructor stub } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ holder = new ViewHolder(); }else{ holder = (ViewHolder) convertView.getTag(); } AppInfo appInfo = appInfos.get(position); holder.setData(appInfo); return holder.getContentView(); } } static class ViewHolder{ ImageView item_icon; TextView item_title,item_size,item_bottom; RatingBar item_rating; private View contentView; protected BitmapUtils bitmapUtils; private AppInfo data; //构造函数,来初始化填充和组件 public ViewHolder(){ bitmapUtils = BitmapHelper.getBitmapUtils(); contentView = View.inflate(UiUtils.getContext(), R.layout.item_app, null); this.item_icon = (ImageView) contentView.findViewById(R.id.item_icon); this.item_title = (TextView) contentView.findViewById(R.id.item_title); this.item_size = (TextView) contentView.findViewById(R.id.item_size); this.item_bottom = (TextView) contentView.findViewById(R.id.item_bottom); this.item_rating = (RatingBar) contentView.findViewById(R.id.item_rating); contentView.setTag(this); } //传递参数 public void setData(AppInfo data) { this.data = data; refreshView(); } //get方法 public View getContentView(){ return contentView; } //更新界面 public void refreshView(){ this.item_title.setText(data.getName());// 设置应用程序的名字 String size = Formatter.formatFileSize(UiUtils.getContext(), data.getSize()); this.item_size.setText(size); this.item_bottom.setText(data.getDes()); float stars = data.getStars(); this.item_rating.setRating(stars); // 设置ratingBar的值 String iconUrl = data.getIconUrl(); //这个地址不全,需要加上apache地址"iconUrl": "app/com.youyuan.yyhl/icon.jpg", //http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg //第一个参数是显示图片的控件,第二个参数是显示图片的url bitmapUtils.display(this.item_icon, HttpHelper.URL+"image?name="+iconUrl); // 显示图片的控件 //bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl); } } @Override public LoadResult load() { HomeProtocal protocol = new HomeProtocal(); appInfos = protocol.load(0); return checkData(appInfos); } }SubjectFragment.java封装之前
package com.ldw.market.fragment; import java.util.List; import com.ldw.market.R; import com.ldw.market.domain.SubjectInfo; import com.ldw.market.fragment.BaseFragment.LoadResult; import com.ldw.market.http.HttpHelper; import com.ldw.market.protocol.SubjectProtocol; import com.ldw.market.utils.BitmapHelper; import com.ldw.market.utils.UiUtils; import com.lidroid.xutils.BitmapUtils; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class SubjectFragment extends BaseFragment { private List<SubjectInfo> datas; @Override public View createSuccessView() { ListView listView=new ListView(UiUtils.getContext()); listView.setAdapter(new SubjectAdapter()); return listView; } private class SubjectAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return datas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return datas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; if(convertView==null){ view=View.inflate(UiUtils.getContext(), R.layout.item_subject, null); holder=new ViewHolder(); holder.item_icon=(ImageView) view.findViewById(R.id.item_icon); holder.item_txt=(TextView) view.findViewById(R.id.item_txt); view.setTag(holder); }else{ view=convertView; holder=(ViewHolder) view.getTag(); } SubjectInfo info=datas.get(position); holder.item_txt.setText(info.getDes()); bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+info.getUrl()); return view; } } class ViewHolder{ ImageView item_icon; TextView item_txt; } @Override protected LoadResult load() { SubjectProtocol protocol=new SubjectProtocol(); datas = protocol.load(0); return checkData(datas); } } 提取以后 package com.ldw.market.fragment; import java.util.List; import com.ldw.market.R; import com.ldw.market.Adapter.DefaultAdapter; import com.ldw.market.domain.SubjectInfo; import com.ldw.market.fragment.BaseFragment.LoadResult; import com.ldw.market.http.HttpHelper; import com.ldw.market.protocol.SubjectProtocol; import com.ldw.market.utils.BitmapHelper; import com.ldw.market.utils.UiUtils; import com.lidroid.xutils.BitmapUtils; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class SubjectFragment extends BaseFragment { private List<SubjectInfo> datas; @Override public View createSuccessView() { ListView listView=new ListView(UiUtils.getContext()); listView.setAdapter(new SubjectAdapter(datas)); return listView; } private class SubjectAdapter extends DefaultAdapter<SubjectInfo>{ //构造函数,初始化数据 public SubjectAdapter(List<SubjectInfo> datas) { super(datas); // TODO Auto-generated constructor stub } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ holder=new ViewHolder(); }else{ holder=(ViewHolder) convertView.getTag(); } SubjectInfo info=datas.get(position); holder.setData(info); return holder.getContentView(); } } class ViewHolder{ ImageView item_icon; TextView item_txt; private View contentView; protected BitmapUtils bitmapUtils; private SubjectInfo data; //构造方法 public ViewHolder(){ bitmapUtils = BitmapHelper.getBitmapUtils(); contentView=View.inflate(UiUtils.getContext(), R.layout.item_subject, null); this.item_icon=(ImageView) contentView.findViewById(R.id.item_icon); this.item_txt=(TextView) contentView.findViewById(R.id.item_txt); contentView.setTag(this); } public void setData(SubjectInfo data) { this.data = data; refreshView(); } //get方法 public View getContentView(){ return contentView; } //更新界面 public void refreshView(){ this.item_txt.setText(data.getDes()); bitmapUtils.display(this.item_icon, HttpHelper.URL+"image?name="+data.getUrl()); } } @Override protected LoadResult load() { SubjectProtocol protocol=new SubjectProtocol(); datas = protocol.load(0); return checkData(datas); } } 自定义Adapter继承BaseAdapter(),使用了泛型来支持多种数据类型 package com.ldw.market.Adapter; import java.util.List; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; /* * BaseAdapter的共性方法的封装,使用泛型封装 */ public class DefaultAdapter<Data> extends BaseAdapter{ protected List<Data> datas; //get方法 public List<Data> getDatas() { return datas; } //set方法 public void setDatas(List<Data> datas) { this.datas = datas; } //构造函数,初始化数据 public DefaultAdapter(List<Data> datas) { this.datas = datas; } @Override public int getCount() { // TODO Auto-generated method stub return datas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return datas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub return null; } }DefaultAdapter.java共性的Adapter
package com.ldw.market.Adapter; import java.util.List; import com.ldw.market.domain.AppInfo; import com.ldw.market.holder.BaseHolder; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; /* * BaseAdapter的共性方法的封装,使用泛型封装 */ public abstract class DefaultAdapter<Data> extends BaseAdapter{ protected List<Data> datas; //get方法 public List<Data> getDatas() { return datas; } //set方法 public void setDatas(List<Data> datas) { this.datas = datas; } //构造函数,初始化数据 public DefaultAdapter(List<Data> datas) { this.datas = datas; } @Override public int getCount() { // TODO Auto-generated method stub return datas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return datas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //BaseHolder使用泛型以支持多种数据类型的Holder BaseHolder<Data> holder; if(convertView == null){ //每一个栏目的holder不一样 holder = getHolder(); }else{ holder = (BaseHolder) convertView.getTag(); } Data data = datas.get(position); holder.setData(data); return holder.getContentView(); } protected abstract BaseHolder<Data> getHolder(); }