不同布局的Item在listView中显示

如果是单一布局在ListView中显示,那么在可以直接

public View getView(int position, View convertView, ViewGroup parent) {
			View view = convertView;
			//执行代码
			return view;
		}
<span style="font-size:18px;">但是,如果多个布局的Item就很麻烦,因为convertView中存的总是一种布局,当出现第二种布局的时候就会出现cannot cast 第一种布局 to 第二种布局的错误。有一种解决方法是把两种布局都写在一起,通过调整不同布局的visibility来做到显示不同的布局,缺点在于不好维护。</span>
<span style="font-size:18px;">之前的一种错误的做法是加一个try catch,当得到的布局不能cast的时候就重新inflate一下新的布局(T_T)。这当然是不行滴。
下面是正确的解决方法,主要用到了getItemViewType,getViewTypeCount。</span>
<span style="font-size:18px;">首先是接口:</span>
<span style="font-size:18px;"></span><pre name="code" class="java">public abstract class IItemInterface {
	protected Context context;
	protected BaseFlashModel mdata;
	protected int pos;
	protected Handler mhandler;
    
    public abstract ItemViewInterface newView(Context context, ViewGroup parent);
	
    protected static ItemViewInterface createCellFromXml(Context context, int layoutID, ViewGroup parent) {
           return (ItemViewInterface) LayoutInflater.from(context).inflate(layoutID, parent, false);
       }
    
    public abstract Context getContext();
	public abstract BaseFlashModel getData();
	public abstract Handler getHandler();
	public abstract void getInformation(BaseFlashModel data , Handler mhandler);
}
下面是接口的实现:
<pre name="code" class="java">
public class UnitItem extends  IItemInterface {

	public  Context mContext;
	public String mPat1 = "yyyy-MM-dd";
	private String mCurrentTime = "test";
	private String mYesterdayTime = "test";
	public TextView unitNum;
	public TextView unitName;
	public View main;
	public View contentLayout;
	
	public UnitItem(Context context) {
		this.context = context;
    }

	public UnitItem(Context context,BaseFlashModel data,Handler mHandler) {
		this.context = context;
		this.mdata = data;
		this.mhandler = mHandler;
    }

	@Override
	public Context getContext(){
		return this.context;
	}
	@Override
	public BaseFlashModel getData(){
		return this.mdata;
	}
	@Override
	public Handler getHandler(){
		return this.mhandler;
	}
	

	@Override
	public ItemViewInterface newView(Context context, ViewGroup parent) {
		// TODO Auto-generated method stub
		return createCellFromXml(context, R.layout.flash_list_item_unit, parent);
	}

	@Override
	public void getInformation(BaseFlashModel data,Handler mhandler) {
		// TODO Auto-generated method stub
		this.mdata = data;
		this.mhandler = mhandler;
	}	
}
这是Item类族,其作用是保存数据。
接下来是接口:
<pre name="code" class="java">public interface ItemViewInterface {
	
	void prepareItemView();
	
	void setObject(IItemInterface item , int pos);
<pre name="code" class="java">
}
 
其实现

public class UnitItemView extends RelativeLayout implements ItemViewInterface {
<span style="white-space:pre">	</span>public  Context mContext;
<span style="white-space:pre">	</span>public String mPat1 = "yyyy-MM-dd";
<span style="white-space:pre">	</span>private String mCurrentTime = "test";
<span style="white-space:pre">	</span>private String mYesterdayTime = "test";
<span style="white-space:pre">	</span>public TextView unitNum;
<span style="white-space:pre">	</span>public TextView unitName;
<span style="white-space:pre">	</span>public View main;
<span style="white-space:pre">	</span>public View contentLayout;
<span style="white-space:pre">	</span>public int position;


<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public UnitItemView(Context context) {
        this(context, null);
    }


    public UnitItemView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public UnitItemView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void prepareItemView() {
<span style="white-space:pre">		</span>main = this;
<span style="white-space:pre">		</span>unitNum = (TextView) this.findViewById(R.id.unit_num);
<span style="white-space:pre">		</span>unitName = (TextView) this.findViewById(R.id.unit_name);
<span style="white-space:pre">		</span>contentLayout = this.findViewById(R.id.unit_layout);
<span style="white-space:pre">	</span>}




<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void setObject(IItemInterface item, int pos) {
<span style="white-space:pre">		</span>// TODO Auto-generated method stub
<span style="white-space:pre">		</span>this.position = pos;
<span style="white-space:pre">		</span>bindItemView(item.getContext(), item.getData(), item.getHandler());
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public void bindItemView(Context activity, BaseFlashModel data, Handler handler) {
<span style="white-space:pre">		</span>if ( data == null) {
<span style="white-space:pre">			</span>return;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>HomeItemInfo info = (HomeItemInfo) data;




<span style="white-space:pre">		</span>unitName.setText(info.unit_name);
<span style="white-space:pre">		</span>unitNum.setText(info.unit_num);




<span style="white-space:pre">		</span>//bindLayout(usedHolder);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>


 



 


 
<span style="font-size:18px;">
</span>
<span style="font-size:18px;"></span><pre name="code" class="java">
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值