ListView的兩大封裝

ListView的兩層封裝

  • 第一層封裝(是關於Adapter中前三個方法的封裝)
  • 1.建立一個積累MyBaseAdapter,繼承製BaseAdapteride

  • 2.在MyBaseAdapter中建立構造方法,經過構造方法把ArrayList類型的數據data傳入,實現前三個構造方法佈局

    代碼以下:this

    private ArrayList<T> data;
    
     public MyBaseAdapter(ArrayList<T> data) {
     	this.data = data;
    
     }
    
     @Override
     public int getCount() {
     	return data.size();
     }
    
     @Override
     public T getItem(int position) {
     	return data.get(position);
     }
    
     @Override
     public long getItemId(int position) {
     	return position;
     }
    
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
     	BaseHolder<T> holder = null;
     	if (convertView == null) {
     		// 子類返回具體對象
     		holder = getHolder();
     	} else {
     		holder = (BaseHolder<T>) convertView.getTag();
     	}
     }
  • 3 讓HomeAdapter繼承MyBaseAdapter.net

  • 第二層封裝(是對getView()方法的封裝)
  • 1 建立類BaseHolder,實現如下4步code

    1) 加載佈局文件
     	2) 初始化控件
     	3) 打標記Tag
     	4) 根據數據刷新界面
    
     	private View mRootView;
     	private T data;
    
     	public BaseHolder() {
     		mRootView = initView();
     		// 3.打標記tag
     		mRootView.setTag(this);
     	}
    
     	/**
     	 * 1.加載佈局
     	 * 2.初始化控件
     	 * [@return](https://my.oschina.net/u/556800)	item的佈局對象
     	 */
     	public abstract View initView();
    
     	/**
     	 * 返回item的佈局對象
     	 * @return	item的佈局對象
     	 */
     	public View getRootView(){
     		return mRootView;
     	}
    
     	/**
     	 * 設置當前item的數據
     	 * @param data	當前item的數據
     	 */
     	public void setData(T data){
     		this.data = data;
     		refreshView(data);
     	}
    
     	/**
     	 * 獲取當前item的數據
     	 * @return	當前item的數據
     	 */
     	public T getData(){
     		return data;
     	}
    
     	/**
     	 * 4.根據數據來刷新界面
     	 * @param data	當前item的數據
     	 */
     	public abstract void refreshView(T data);
  • 2 建立HomeHolder,繼承BaseHolder,實現BaseHolder中的兩個抽象方法對象

    代碼以下:
    
     	private TextView tv_content;
    
     	@Override
     	public View initView() {
     		View view = UIUtils.inflate(R.layout.list_item_home);
     		tv_content = (TextView) view.findViewById(R.id.tv_content);
     		return view;
     	}
    
     	@Override
     	public void refreshView(String data) {
     		tv_content.setText(data);
     	}
  • 3 在MyBaseAdapter中實現方法getView的邏輯繼承

    @Override
     	public View getView(int position, View convertView, ViewGroup parent) {
     		BaseHolder<T> holder = null;
     		if (convertView == null) {
     			// 子類返回具體對象
     			holder = getHolder();
     		} else {
     			holder = (BaseHolder<T>) convertView.getTag();
     		}
    
     		// 根據數據來刷新界面
     		holder.setData(getItem(position));
     		return holder.getRootView();
     	}
    
     	public abstract BaseHolder<T> getHolder();
     注意:要在類名前加abstract關鍵字
  • 4 建立HomeAdapter,繼承MyBaseAdapter,實現構造方法和getHolder的方法get

    public HomeAdapter(ArrayList<String> data) {
     	super(data);
     	}
    
     	@Override
     	public BaseHolder<String> getHolder() {
     		return new HomeHolder();
     	}

之後再寫ListView的Adapter時只須要實現第四步中的兩個方法就能夠了,大大減小了代碼量,在ListView不少的項目中仍是很方便的。it

相關文章
相關標籤/搜索