2015年6月25日 星期四

UITableView and ListView in Polymorphism

UITableView and ListView都有dequeue cell and item的作用,一些心得,

可使用autolayout
_mainTableView.estimatedRowHeight =  44;

_mainTableView.rowHeight = UITableViewAutomaticDimension;

一個tableview的cell會保持自己的instance,你無法取代新的instance該裡面的cell,尤其UIWebView塞進cell更是難以計算高度,用之前千萬三思。


Android ListView更為複雜,一個getView會call三次左右才決定一個item,我設計了一個polymorphism 的架構來控制items


interface {

    public abstract int getType();
    public abstract void setViewHolder(View convertView);
    public abstract void inflateViewHolder(View convertView);
    public abstract View getTemplateView(ViewGroup parent);

}



@Override
public int getItemViewType(int position) {
    return ((interface) getItem(position)).getType();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final int type = getItemViewType(position);

    if (convertView != null) {
        mList.get(position).inflateViewHolder(convertView);
    } else {
        convertView = mList.get(position).getTemplateView(parent);
        mList.get(position).setViewHolder(convertView);
    }

return convertView;

}

mList必須保持所有子item的data instance,注意只有data不存view,那麼getItemViewType內的gettype決定你item type,之後需傳入convertView給該子item作render。以及null的情況下new一個新的instance view給convertView。

目前使用起來沒出問題,listview item開兩萬個也無礙,我想應該是可行的。