谷歌应用市场3

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;
			}
			
		});


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值