Saturday, October 10, 2015

ListView 如何实现不同的布局的加载

今天遇到了很恶心的问题。ListView 加载不同的布局, 每一个中布局的样式是不一样的。这是很蛋疼的问题。我为此疼了很长的时间。




今天,之前我做了一个Listview 需要加载不同的布局,我很是自以为是的认为加载一个不就就够了,然后做不同的判断。尽管我感觉自己的方法提炼的不错了,但是还是不行啊!
还是很恶心的代码,因为,当你的需求改变的时候,你需要添加一种需求的时候,这是很蛋疼的问题呀。因为,这个时候,你之前写的代码都需要改变,这就违背了 开闭原则。所以,不建议这么写的。

所以,我就用了一种很不错的方法。 
根据不同的实体的状态,加载不同的布局,这样的话就会很好的解决修改很复杂的问题,尤其是当别人来修改你的代码的时候,他们就不会特别的恶心,因为你做了很多的事情,你不仅是为了完成今天的任务,同时我也考虑到了以后的时候,为自己节约了更多的时间做其他的事情。

不同的状态对应不同的布局,这是很不错的方案!
就是多写几套布局罢了!

在我们的Adapter 中:我们必须要重写父类的两个方法:
@Overridepublic int getViewTypeCount() {
    return DEFALT_MAX_TYPE_NUMBER;}

@Overridepublic int getItemViewType(int position) {
    return getItem(position).getStatus();}


getViewTypeCount() 获取当前的ListView所有Items 一共的状态,我的建议是 这个值 一定要大于 你的状态的种类!例如: 你有需要写五种布局的时候,只需要将 这个返回值大于5 就好!

getItemViewType(int position)
这个方法,会根据不同的状态吗,返回不同的View, View 有唯一的TAG  viewHodler. 这样子 就确定了 一个状态对应一种布局 一个ViewHolder

下面是我们的getView()  会非常的简介:
@Overridepublic View getView(int position, View view, ViewGroup root) {

    final SaleHouseEntityV27 entity = getItem(position);
    status = getItemViewType(position);
    switch (status) {
        case NOT_GRAB_A_SINGLE:
            view = initNotGrabASingleView(view, root, entity);            break;        case NOT_REAL_PROSPECTING:
            view = initNotRealProSpetingView(view, root, entity);            break;        case HAS_REAL_PROSPECTING:
            view = initHasRealProspectingView(view, root, entity);            break;        case HAS_REPORT:
            view = initHasReportView(view, root, entity);            break;        case HOUSE_DEALING:
            view = initHouseDealingView(view, root, entity);            break;        case HOUSE_DEAL_SUCCESS:
            view = initHouseDealSuccessView(view, root, entity);            break;        case HOUSE_TEMP_NOT_SALE:
            view = initHouseTempNotSaleView(view, root, entity);            break;    }

    return view;}



参考我的Github:
https://github.com/GeekHades/Hades

No comments:

Post a Comment