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

相关文章
相关标签/搜索