Android HolderView实现的数据源(Adapter)

        转载请注明出处:http://blog.csdn.net/lhlhlh111000/article/details/38660287(我爱吃鱼的博客)   

先前有看别人介绍ViewHolder模式;在我们编写数据源(Adapter)的时候,getView方法中难免会有逻辑处理的业务;如果是简单点的逻辑,getView方法中或许不会太臃肿,但当逻辑处理复杂多变的时候,getView方法整个就会看起来特别臃肿,相对的如果后期有什么需求变动,维护起来也很麻烦。为了让getView中逻辑尽量清晰,简单,所以将业务逻辑的处理交给ViewHolder处理,getView方法中只实现简单View获取;看下实现:

1、数据源的实现

public class HolderViewAdapter extends BaseAdapter {

	private Context mContext;
	
	private int mViewRes;
	
	private LinkedList mListData = new LinkedList();
	
	public HolderViewAdapter(Context context, int viewRes) {
		this.mContext = context;
		this.mViewRes = viewRes;
	}

	@Override
	public int getCount() {
		return mListData.size();
	}

	@Override
	public Object getItem(int position) {
		return position >= mListData.size() ? null : mListData.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		try {
			HolderView holder = null;
			if(null == convertView) {
				holder = new HolderView();
				convertView = LayoutInflater.from(mContext).inflate(mViewRes, null);
				holder.mView = convertView;
				convertView.setTag(holder);	
			}else {
				holder = (HolderView) convertView.getTag();
			}
			
			// 填充数据
			if(holder.mView instanceof HolderViewImpl) {
				((HolderViewImpl) holder.mView).setData(getItem(position));
			}
			
			return convertView;
		}catch (Exception e) {
			return new View(mContext);
		}
	}
	
	/**
	 * 更新数据源
	 * @param data
	 */
	public void refresh(List data) {
		mListData.clear();
		mListData.addAll(data);
		notifyDataSetChanged();
	}
	
	/**
	 * 添加数据源
	 * @param data
	 */
	public void add(List data) {
		mListData.addAll(data);
		notifyDataSetChanged();
	}
	
	/**
	 * 添加单个数据源
	 * @param object
	 */
	public void add(E object) {
		mListData.add(object);
		notifyDataSetChanged();
	}

	private static class HolderView {
		View mView;
	}

	public interface HolderViewImpl {
		
		public  void setData(E data);
	}
}

这里我将数据源定义成一个接收泛型的数据源是为了通用性,针对先前每个列表一个数据源不好管理问题。构造方法要求两个传递参数,一个是上下文,这个没什么好说,另外一个是HolderView的布局文件,在getView中通过这个布局文件直接获取View。



    
   	



	

2、HolderView的实现


public class HolderViewItemView extends RelativeLayout implements HolderViewImpl {
	
	private TextView mTxvViewHolder;

	public HolderViewItemView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		mTxvViewHolder = (TextView) findViewById(R.id.txv_view_holder);
	}
	
	@Override
	public  void setData(E data) {
		if(null == mTxvViewHolder) {
			return;
		}
		
		// 数据设置
		mTxvViewHolder.setText((String) data);
	}
}

这边简单做了一个示例;setData中处理我们的逻辑,将业务逻辑处理从getView方法中剥离出来。

3、结合使用


        private ListView mLsvViewHolder;
	
	private HolderViewAdapter mAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mLsvViewHolder = new ListView(this);
		setContentView(mLsvViewHolder);
		
		initUI();
	}
	
	private void initUI() {
		mAdapter = new HolderViewAdapter(this, R.layout.item_view_hoder);
		mLsvViewHolder.setAdapter(mAdapter);
		
		mAdapter.refresh(loadTestData());
	}
	
	/**
	 * 加载测试数据
	 * @return
	 */
	private List loadTestData() {
		ArrayList result = new ArrayList();
		
		for(int i=0; i<30; i++) {
			result.add("Hello view holder " + i);
		}
		
		return result;
	}


这样一个列表就出来了;以后适配器就只需要维护一个,针对不同的页面只要提供不同的HolderView。


demo下载地址:http://pan.baidu.com/s/1sjoEzfv

 
   
 

你可能感兴趣的:(Android HolderView实现的数据源(Adapter))