1.DefaultAdapter&BaseHolder
1.把ListView的Adapter抽取到父类中
public class DefaultAdapter<T> extends BaseAdapter {
protected List<T> datas;
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
//构造方法传参数
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int arg0) {
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
}
2.getView方法中与Holder相关的放在Holder中
(1)提取之前
public class HomeAdapter extends BaseAdapter {
@Override
public int getCount() {
return datas.size();
}
@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=convertView;
holder=(ViewHolder) view.getTag();
}
AppInfo appInfo=datas.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(); //http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
bitmapUtils=BitmapHelper.getBitmapUtils();
// 显示图片的控件
bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl);
return view;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
}
static class ViewHolder {
ImageView item_icon;
TextView item_title, item_size, item_bottom;
RatingBar item_rating;
}
(2)提取之后
public class HomeAdapter extends BaseAdapter {
@Override
public int getCount() {
return datas.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
} else {
view = convertView;
holder = (ViewHolder) view.getTag();
}
AppInfo appInfo = datas.get(position);
holder.setData(appInfo);
return holder.getContentView();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
}
static class ViewHolder {
ImageView item_icon;
TextView item_title, item_size, item_bottom;
RatingBar item_rating;
private View contentView;
private AppInfo data;
private BitmapUtils bitmapUtils;
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 View getContentView() {
return contentView;
}
public void setData(AppInfo data) {
this.data = data;
refreshView();
}
private 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(); // http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
bitmapUtils = BitmapHelper.getBitmapUtils();
// 显示图片的控件
bitmapUtils.display(this.item_icon, HttpHelper.URL + "image?name="
+ iconUrl);
}
}
3.再把Holder抽取成父类BaseHolder
public abstract class BaseHolder<T> {
private View contentView;
private T data;
protected BitmapUtils bitmapUtils;
public BaseHolder() {
bitmapUtils = BitmapHelper.getBitmapUtils();
contentView=initView();
contentView.setTag(this);
}
public abstract View initView();
public View getContentView() {
return contentView;
}
public void setData(T data) {
this.data = data;
refreshView();
}
public abstract void refreshView();
}
4.HomeFragment中ViewHolder继承BaseHolder
只需实现refreshView方法和initView方法
static class ViewHolder extends BaseHolder<AppInfo>{
ImageView item_icon;
TextView item_title, item_size, item_bottom;
RatingBar item_rating;
public void refreshView(AppInfo data) {
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(); // http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
bitmapUtils = BitmapHelper.getBitmapUtils();
// 显示图片的控件
bitmapUtils.display(this.item_icon, HttpHelper.URL + "image?name="
+ iconUrl);
}
@Override
public View initView() {
View 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);
return contentView;
}
}
5.把getView方法也提取到DefaultAdapter中
子类只需实现getHolder方法
public abstract class DefaultAdapter<T> extends BaseAdapter {
protected List<T> datas;
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
//构造方法传参数
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int arg0) {
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
BaseHolder<T> holder;
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder<T>) convertView.getTag();
}
T appInfo = datas.get(position);
holder.setData(appInfo);
return holder.getContentView();
}
public abstract BaseHolder<T> getHolder();
}
6.最终化简为
public class HomeAdapter extends DefaultAdapter<AppInfo> {
public HomeAdapter(List<AppInfo> datas) {
super(datas);
}
@Override
public BaseHolder<AppInfo> getHolder() {
return new HomeHolder();
}
}
7.总结
(1) 抽取Adapter 共性的方法
(2) 把getView方法里 和holder相关的逻辑 摘取到Holder代码中
(3) 把Holder 相关的代码 抽取到BaseHolder中
(4)把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder
2.应用&游戏界面
1.AppProtocol
public class AppProtocol extends BaseProtocol<List<AppInfo>> {
@Override
public List<AppInfo> paserJson(String json) {
List<AppInfo> appInfos=new ArrayList<AppInfo>();
try {
JSONArray jsonArray=new JSONArray(json);
for(int i=0;i<jsonArray.length();i++){
JSONObject object=jsonArray.getJSONObject(i);
long id=object.getLong("id");
String name=object.getString("name");
String packageName=object.getString("packageName");
String iconUrl = object.getString("iconUrl");
float stars=Float.parseFloat(object.getString("stars"));
long size=object.getLong("size");
String downloadUrl = object.getString("downloadUrl");
String des = object.getString("des");
AppInfo info=new AppInfo(id, name, packageName, iconUrl, stars, size, downloadUrl, des);
appInfos.add(info);
}
return appInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
@Override
public String getKey() {
return "app";
}
}
2.AppFragment
(1)因为AppHolder与HomeHolder相似,所以抽取成一个类共用
public class ListBaseHolder extends BaseHolder<AppInfo> {
ImageView item_icon;
TextView item_title, item_size, item_bottom;
RatingBar item_rating;
public void refreshView(AppInfo data) {
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(); // http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
bitmapUtils = BitmapHelper.getBitmapUtils();
// 显示图片的控件
bitmapUtils.display(this.item_icon, HttpHelper.URL + "image?name="
+ iconUrl);
}
@Override
public View initView() {
View 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);
return contentView;
}
}
(2)因为AppAdapter与HomeAdapter相同,所以抽取成一个类共用
public class ListBaseAdapter extends DefaultAdapter<AppInfo>{
public ListBaseAdapter(List<AppInfo> datas) {
super(datas);
// TODO Auto-generated constructor stub
}
@Override
public BaseHolder<AppInfo> getHolder() {
return new ListBaseHolder();
}
}
3.游戏界面
(1)GameProtocol 联网协议
public class GameProtocol extends BaseProtocol<List<AppInfo>> {
@Override
public List<AppInfo> paserJson(String json) {
List<AppInfo> appInfos=new ArrayList<AppInfo>();
try {
JSONArray jsonArray=new JSONArray(json);
for(int i=0;i<jsonArray.length();i++){
JSONObject object=jsonArray.getJSONObject(i);
long id=object.getLong("id");
String name=object.getString("name");
String packageName=object.getString("packageName");
String iconUrl = object.getString("iconUrl");
float stars=Float.parseFloat(object.getString("stars"));
long size=object.getLong("size");
String downloadUrl = object.getString("downloadUrl");
String des = object.getString("des");
AppInfo info=new AppInfo(id, name, packageName, iconUrl, stars, size, downloadUrl, des);
appInfos.add(info);
}
return appInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
/**
* 请求服务器的关键字
*/
@Override
public String getKey() {
return "game";
}
}
(2)GameFragment
public class GameFragment extends BaseFragment {
private List<AppInfo> datas;
@Override
public View createSuccessView() {
BaseListView lv=new BaseListView(Uiutils.getContext());
lv.setAdapter(new ListBaseAdapter(datas));
return lv;
}
@Override
public LoadResult load() {
GameProtocol protocol = new GameProtocol();
datas = protocol.load(0);
return checkData(datas);
}
}
3.MoreHolder
1.重新理一遍(视频)
2.每一个条目不是View,而是Holder,管理着View。
3.加载更多item,创建一个MoreHolder,管理View。 面向Holder编程
(1)布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<RelativeLayout
android:id="@+id/rl_more_loading"
android:layout_width="match_parent"
android:layout_height="@dimen/list_item_loadmore_height"
android:layout_marginLeft="@dimen/list_item_margin"
android:layout_marginRight="@dimen/list_item_margin"
android:background="@drawable/list_item_bg_normal"
android:gravity="center" >
<ProgressBar
android:id="@+id/loading_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/loading_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/loading_pb"
android:ellipsize="end"
android:gravity="center"
android:padding="5dp"
android:singleLine="true"
android:text="@string/load_more"
android:textColor="#ff717171"
android:textSize="14dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_more_error"
android:layout_width="match_parent"
android:layout_height="@dimen/list_item_loadmore_height"
android:layout_marginLeft="@dimen/list_item_margin"
android:layout_marginRight="@dimen/list_item_margin"
android:background="@drawable/list_item_bg"
android:gravity="center"
android:visibility="invisible" >
<TextView
android:id="@+id/loading_error_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:ellipsize="end"
android:gravity="center"
android:padding="5dp"
android:singleLine="true"
android:text="@string/load_error"
android:textColor="#ff717171"
android:textSize="14dp" />
</RelativeLayout>
</FrameLayout>
(2)MoreHolder
public class MoreHolder extends BaseHolder<Integer> {
@Override
public View initView() {
View view =View.inflate(Uiutils.getContext(), R.layout.load_more, null);
return view;
}
@Override
public void refreshView(Integer data) {
// TODO Auto-generated method stub
}
}
(3)在DefaultAdapter中getView再添加一个条目(加载更多)
public int getCount() {
return datas.size()+1;
}
@Override
public Object getItem(int arg0) {
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
BaseHolder holder;
if(position==datas.size()){
holder=new MoreHolder();
return holder.getContentView();
}
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder<T>) convertView.getTag();
}
T appInfo = datas.get(position);
holder.setData(appInfo);
return holder.getContentView();
}
3.ListView 多类型复用
1.contertView :ListView中移出屏幕的item不会立即销毁,会存储到一个内存块contertView中
2.谷歌官方推荐复用ListView方法,ListView多类型复用
public abstract class DefaultAdapter<T> extends BaseAdapter {
protected List<T> datas;
private static final int DEFAULT_ITEM = 0; //普通类型
private static final int MORE_ITEM = 1; //加载更多类型
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
//构造方法传参数
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size()+1;
}
@Override
public Object getItem(int arg0) {
return datas.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
//********************************************************
/** 根据位置 判断当前条目是什么类型 */
@Override
public int getItemViewType(int position) { //20
if (position == datas.size()) { // 当前是最后一个条目
return MORE_ITEM;
}
return DEFAULT_ITEM; // 如果不是最后一个条目 返回默认类型
}
/** 当前ListView 有几种不同的条目类型 */
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 2 有两种不同的类型,会有两块复用内存contertView
}
//*********************************************************
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
BaseHolder holder=null;
//谷歌官方写法 switch
switch (getItemViewType(position)) { // 判断当前条目时什么类型
case MORE_ITEM:
if(convertView==null){
holder=new MoreHolder(); //也可以getHolder()
}else{
holder=(BaseHolder) convertView.getTag();
}
break;
case DEFAULT_ITEM:
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder) convertView.getTag();
}
if (position < datas.size()) {
holder.setData(datas.get(position));
}
break;
}
return holder.getContentView();
}
public abstract BaseHolder<T> getHolder();
}
5.加载更多业务逻辑
1. return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示
所以复用BaseHolder的getContentView()方法
2.MoreHolder
public class MoreHolder extends BaseHolder<Integer> {
public static final int HAS_NO_MORE=0; // 没有额外数据了
public static final int LOAD_ERROR=1;// 加载失败
public static final int HAS_MORE=2;// 有额外数据
@Override
public View initView() {
View view = View
.inflate(Uiutils.getContext(), R.layout.load_more, null);
return view;
}
@Override
public View getContentView() {
loadMore(); // 加载更多数据
return super.getContentView();
}
private DefaultAdapter adapter;
public MoreHolder(DefaultAdapter adapter) {
super();
this.adapter = adapter;
}
private void loadMore() {
// 请求服务器 加载下一批数据
// 交给Adapter 让Adapter 加载更多数据
adapter.loadMore();
}
@Override
public void refreshView(Integer data) {
// TODO Auto-generated method stub
}
}
3.DefaultAdapter
public abstract class DefaultAdapter<Data> extends BaseAdapter {
protected List<Data> datas;
private static final int DEFAULT_ITEM = 0; //普通类型
private static final int MORE_ITEM = 1; //加载更多类型
public List<Data> getDatas() {
return datas;
}
public void setDatas(List<Data> datas) {
this.datas = datas;
}
public DefaultAdapter(List<Data> datas) {
this.datas = datas;
}
@Override
public int getCount() {
return datas.size() + 1; // 最后的一个条目 就是加载更多的条目
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
/** 根据位置 判断当前条目是什么类型 */
@Override
public int getItemViewType(int position) { //20
if (position == datas.size()) { // 当前是最后一个条目
return MORE_ITEM;
}
return getInnerItemViewType(position); // 如果不是最后一个条目 返回默认类型
}
private int getInnerItemViewType(int position) {
return DEFAULT_ITEM;
}
/** 当前ListView 有几种不同的条目类型 */
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 2 有两种不同的类型,会有两块复用内存contertView
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder holder = null;
//谷歌官方写法 switch
switch (getItemViewType(position)) { // 判断当前条目时什么类型
case MORE_ITEM:
if(convertView==null){
holder=getMoreHolder();
}else{
holder=(BaseHolder) convertView.getTag();
}
break;
case DEFAULT_ITEM:
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder) convertView.getTag();
}
if (position < datas.size()) {
holder.setData(datas.get(position));
}
break;
}
return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示
}
private MoreHolder holder;
private BaseHolder getMoreHolder() {
if(holder!=null){
return holder;
}else{
holder=new MoreHolder(this);
return holder;
}
}
protected abstract BaseHolder<Data> getHolder();
/**
* 当加载更多条目显示的时候 调用该方法
*/
public void loadMore() {
ThreadManager.getInstance().createLongPool().execute(new Runnable() {
@Override
public void run() {
// 在子线程中加载更多
final List<Data> newData = onload();
UiUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if(newData==null){
holder.setData(MoreHolder.LOAD_ERROR);//
}else if(newData.size()==0){
holder.setData(MoreHolder.HAS_NO_MORE);
}else{
// 成功了
holder.setData(MoreHolder.HAS_MORE);
datas.addAll(newData);// 给listView之前的集合添加一个新的集合
notifyDataSetChanged();// 刷新界面
}
}
});
}
});
}
/**
* 加载更多数据
*/
protected abstract List<Data> onload();
}
加载更多留给子类实现
7.加载更多
1.
public class MoreHolder extends BaseHolder<Integer> {
public static final int HAS_NO_MORE=0; // 没有额外数据了
public static final int LOAD_ERROR=1;// 加载失败
public static final int HAS_MORE=2;// 有额外数据
private RelativeLayout rl_more_loading,rl_more_error;
/**当Holder显示的时候 显示什么样子*/
@Override
public View initView() {
View view=UiUtils.inflate(R.layout.load_more);
rl_more_loading=(RelativeLayout) view.findViewById(R.id.rl_more_loading);
rl_more_error=(RelativeLayout) view.findViewById(R.id.rl_more_error);
return view;
}
private DefaultAdapter adapter;
public MoreHolder(DefaultAdapter adapter) {
super();
this.adapter=adapter;
}
@Override
public View getContentView() {
loadMore();
return super.getContentView();
}
private void loadMore() {
// 请求服务器 加载下一批数据
// 交给Adapter 让Adapter 加载更多数据
adapter.loadMore();
}
/**根据数据做界面的修改*/
@Override
public void refreshView(Integer data) {
rl_more_error.setVisibility(data==LOAD_ERROR?View.VISIBLE:View.GONE);
rl_more_loading.setVisibility(data==HAS_MORE?View.VISIBLE:View.GONE);
}
}
public abstract class DefaultAdapter<Data> extends BaseAdapter {
protected List<Data> datas;
private static final int DEFAULT_ITEM = 0; //普通类型
private static final int MORE_ITEM = 1; //加载更多类型
public List<Data> getDatas() {
return datas;
}
public void setDatas(List<Data> datas) {
this.datas = datas;
}
public DefaultAdapter(List<Data> datas) {
this.datas = datas;
}
@Override
public int getCount() {
return datas.size() + 1; // 最后的一个条目 就是加载更多的条目
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
/** 根据位置 判断当前条目是什么类型 */
@Override
public int getItemViewType(int position) { //20
if (position == datas.size()) { // 当前是最后一个条目
return MORE_ITEM;
}
return getInnerItemViewType(position); // 如果不是最后一个条目 返回默认类型
}
private int getInnerItemViewType(int position) {
return DEFAULT_ITEM;
}
/** 当前ListView 有几种不同的条目类型 */
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 2 有两种不同的类型,会有两块复用内存contertView
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder holder = null;
//谷歌官方写法 switch
switch (getItemViewType(position)) { // 判断当前条目时什么类型
case MORE_ITEM:
if(convertView==null){
holder=getMoreHolder();
}else{
holder=(BaseHolder) convertView.getTag();
}
break;
case DEFAULT_ITEM:
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder) convertView.getTag();
}
if (position < datas.size()) {
holder.setData(datas.get(position));
}
break;
}
return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示
}
private MoreHolder holder;
private BaseHolder getMoreHolder() {
if(holder!=null){
return holder;
}else{
holder=new MoreHolder(this);
return holder;
}
}
protected abstract BaseHolder<Data> getHolder();
/**
* 当加载更多条目显示的时候 调用该方法
*/
public void loadMore() {
ThreadManager.getInstance().createLongPool().execute(new Runnable() {
@Override
public void run() {
// 在子线程中加载更多
final List<Data> newData = onload();
UiUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
if(newData==null){
holder.setData(MoreHolder.LOAD_ERROR);//
}else if(newData.size()==0){
holder.setData(MoreHolder.HAS_NO_MORE);
}else{
// 成功了
holder.setData(MoreHolder.HAS_MORE);
datas.addAll(newData);// 给listView之前的集合添加一个新的集合
notifyDataSetChanged();// 刷新界面
}
}
});
}
});
}
/**
* 加载更多数据
*/
protected abstract List<Data> onload();
}
8.框架复习
1.Demo(两个ListView抽取共性)
2.DefaultAdapter
public abstract class DefaultAdapter<T> extends BaseAdapter {
private List<T> datas;
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//convertView 划出屏幕的view对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<T> holder;
if(convertView==null){
holder=getHolder();
}else{
holder=(BaseHolder<T>)convertView.getTag();
}
T string = datas.get(position);
//holder.refreshView(string);
holder.setData(string);
return holder.getContentView();
}
protected abstract BaseHolder<T> getHolder();
}
3.BaseHolder
public abstract class BaseHolder<T> {
protected View contentView;
protected T data;
public BaseHolder(){
contentView=initView();
contentView.setTag(this); // 在这个位置设置的标签
}
public void setData(T data) {
this.data=data;
refreshView(data);
}
/**
* 当Holder中的view对象显示到界面上的时候调用
* @return
*/
public View getContentView() {
return contentView;
}
/**
* 当setData调用的时候 会调用该方法 根据数据 显示界面
*/
protected abstract void refreshView(T data);
/**
* 初始化View对象 及其控件
* @return
*/
protected abstract View initView();
}
4.FirstActivity
public class MainActivity extends Activity {
private ListView lv;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("aabbbcc"+i);
}
lv=(ListView) findViewById(R.id.lv);
lv.setAdapter(new MainAdapter(datas));
}
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent);
}
private class MainAdapter extends DefaultAdapter<String>{
public MainAdapter(List<String> datas) {
super(datas);
// TODO Auto-generated constructor stub
}
@Override
protected BaseHolder<String> getHolder() {
return new MainHolder();
}
}
class MainHolder extends BaseHolder<String>{
private TextView tv;
// 当执行new MainHolder() 会调用该方法
@Override
protected void refreshView(String data) {
this.tv.setText(data);
}
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv=(TextView) view.findViewById(R.id.tv);
return view;
}
}
}
5.SecondActivity
public class SecondActivity extends Activity {
private ListView lv_second;
private List<Drawable> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
}
lv_second.setAdapter(new SecondAdapter(datas));
}
private class SecondAdapter extends DefaultAdapter<Drawable>{
public SecondAdapter(List<Drawable> datas) {
super(datas);
}
@Override
protected BaseHolder<Drawable> getHolder() {
return new SecondHolder();
}
}
class SecondHolder extends BaseHolder<Drawable>{
ImageView iv;
@Override
protected void refreshView(Drawable data) {
iv.setImageDrawable(data);
}
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_second, null);
this.iv=(ImageView) view.findViewById(R.id.iv);
return view;
}
}
}
10.HomePictrueHolder
1.ViewPager(轮播条)
2.HomePictureHolder
public class HomePictureHolder extends BaseHolder<List<String>> {
/*当new HomePictureHolder()就会调用该方法 */
private ViewPager viewPager;
private List<String> datas;
@Override
public View initView() {
FrameLayout frameLayout =new FrameLayout(UiUtils.getContext());
frameLayout.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,240));
viewPager=new ViewPager(UiUtils.getContext());
viewPager.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,240));
frameLayout.addView(viewPager);
return frameLayout;
}
/*当 holder.setData 才会调用*/
@Override
public void refreshView(List<String> datas) {
this.datas=datas;
viewPager.setAdapter(new HomeAdapter());
//viewPager.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
}
class HomeAdapter extends PagerAdapter{
// 当前viewPager里面有多少个条目
@Override
public int getCount() {
return datas.size();
}
/*判断返回的对象和 加载view对象的关系*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);
container.removeView((View)object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView=new ImageView(UiUtils.getContext());
bitmapUtils.display(imageView, HttpHelper.URL+"image?name="+datas.get(position));
container.addView(imageView); //加载的view对象
return imageView; // 返回的对象
}
}
}
3.HomeFragment
public View createSuccessView() {
BaseListView listView=new BaseListView(UiUtils.getContext());
HomePictureHolder holder=new HomePictureHolder();
holder.setData(pictures);
View contentView = holder.getContentView(); // 得到holder里面管理的view对象
contentView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
listView.addHeaderView(contentView); // 把holder里的view对象 添加到listView的上面
listView.setAdapter(new ListBaseAdapter(datas){
@Override
protected List<AppInfo> onload() {
HomeProtocol protocol=new HomeProtocol();
List<AppInfo> load = protocol.load(datas.size());
datas.addAll(load);
return load;
}
});