07
8
内容纲要
今天介绍Mono for android中ListView控件使用,并且支持在ListView中嵌入button,支持button触发单独事件,ListView自身的行触发单独时间。
别小看了这个问题,MonoDroid(mono for android的前身)刚刚出来的时候,ListView里面是不能嵌入button的,即使能嵌入也不支持单独事件,还好新版本支持了。这里会涉及到一些技巧,我只是大致讲一下思路,后期会做成项目发到github上面去,大家下载下来就ok。
我要实现的效果是,在ListView的每一行里添加button按钮,并且点击ListView的行进入该行详情,点击行上面的按钮,则进入其他相关操作,比如购买、订阅,如下图所示:
按照语法,分别创建AnimalListActivity和AnimalListAdapter,这里主要关注度在Adapter里面怎么给button添加click事件,特别是复用和不复用item的情况。
view.FindViewById<Button> (Resource.Id.btn_Take).Click += delegate {
Intent intent = new Intent (this.context, typeof(BuyActivity));
context.StartActivity (intent);
};
1、如果不复用item,可以实现上面的效果,但是如果加载的数据流超过50左右直接会导致卡死;所以必须得复用;
2、如果复用item,需要注意如何给button添加复用事件。我已经想到解决办法了:只能在item的view被创建的第一次的时候给item加click事件,否则会支持n+1次
if (convertView == null || !(convertView is TableLayout))
{
view = context.LayoutInflater.Inflate(Resource.Layout.SubListItems, parent, false);
//订阅按钮
var Iv_sub=view.FindViewById<ImageView>(Resource.Id.Iv_Sub);
Iv_sub.Tag=position;
Iv_sub.Click += delegate
{
int pos=Convert.ToInt32(Iv_sub.Tag);
这里还需要用到一个技巧Iv_sub.Tag=position;和int pos=Convert.ToInt32(Iv_sub.Tag);这两段代码是相呼应的。