带图像按钮的列表视图效果不佳
Listview with imagebutton bad work
我在列表视图的每一行中都有 Like 按钮,
单击它们时,它们的颜色会变为红色!
当我连续点击图片按钮并向下滚动列表视图时,除了点击图片按钮外,其他图片按钮也会改变颜色
为什么 ????
public override View GetView(int position,View convertView,ViewGroup parent)
{
var item = (Tips)this.GetItem(position);
View view = convertView;
if (view == null)
{
view = this.activity.LayoutInflater.Inflate(Resource.Layout.list_item_Tips, null);
}
var TextTitle = view.FindViewById<TextView>(Resource.Id.titletxt);
TextTitle.Text = item.TITLE;
var TextWriter = view.FindViewById<TextView>(Resource.Id.contenttxt);
TextContent.Text = item.CONTENT;;
view.FindViewById<ImageButton>(Resource.Id.Like).Click += (sender, e) =>
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
item.LIKE = true;
item.LIKE_COUNT++;
view.FindViewById<TextView>(Resource.Id.like_count).Text = item.LIKE_COUNT.ToString();
}
};
return view;
}
Link 错误图片:
出现你说的现象是因为listview items被回收了,为了保证正确的行为,获取view对象后检查item.LIKE是否为真,如果为真,改变颜色,否则显示正常颜色
public override View GetView(int position,View convertView,ViewGroup parent)
{
var item = (Tips)this.GetItem(position);
View view = convertView;
if (view == null)
{
view = this.activity.LayoutInflater.Inflate(Resource.Layout.list_item_Tips, null);
}
var TextTitle = view.FindViewById<TextView>(Resource.Id.titletxt);
TextTitle.Text = item.TITLE;
var TextWriter = view.FindViewById<TextView>(Resource.Id.contenttxt);
TextContent.Text = item.CONTENT;;
if(item.LIKE)
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
}
else
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_normal);
}
view.FindViewById<ImageButton>(Resource.Id.Like).Click += (sender, e) =>
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
item.LIKE = true;
item.LIKE_COUNT++;
view.FindViewById<TextView>(Resource.Id.like_count).Text = item.LIKE_COUNT.ToString();
NotifyDataSetChanged();
}
};
return view;
}
代码可能不正确,我不熟悉 Xamarin 语法
出现此问题是因为视图行未正确回收,因此引用了错误的视图行。使用 viewholder class 声明所有控件并将此 class 的实例标记到每一行。
例如:
public override View GetView (int position, View convertView, ViewGroup parent)
{
View rowView = convertView;
//reuse view
if (rowView == null) {
rowView = _context.LayoutInflater.Inflate (Resource.Layout.ItemCustomLayout, parent, false);
viewHolder = new ViewHolderItem ();
viewHolder.txtTemName = rowView.FindViewById<TextView>(Resource.Id.lblItemName);
rowView.Tag = viewHolder; //attaching viewholder reference to row
}
else
{
viewHolder = (ViewHolderItem)rowView.Tag; //during row re-use get the instance of the view holder
}
viewHolder.txtTemName.Text = strX;
return rowView;
}
//视图持有者class
class ViewHolderItem :Java.Lang.Object
{
internal TextView txtTemName;
}
在此处查找更多详细信息:http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#ViewHolderTag
我在列表视图的每一行中都有 Like 按钮, 单击它们时,它们的颜色会变为红色!
当我连续点击图片按钮并向下滚动列表视图时,除了点击图片按钮外,其他图片按钮也会改变颜色 为什么 ????
public override View GetView(int position,View convertView,ViewGroup parent)
{
var item = (Tips)this.GetItem(position);
View view = convertView;
if (view == null)
{
view = this.activity.LayoutInflater.Inflate(Resource.Layout.list_item_Tips, null);
}
var TextTitle = view.FindViewById<TextView>(Resource.Id.titletxt);
TextTitle.Text = item.TITLE;
var TextWriter = view.FindViewById<TextView>(Resource.Id.contenttxt);
TextContent.Text = item.CONTENT;;
view.FindViewById<ImageButton>(Resource.Id.Like).Click += (sender, e) =>
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
item.LIKE = true;
item.LIKE_COUNT++;
view.FindViewById<TextView>(Resource.Id.like_count).Text = item.LIKE_COUNT.ToString();
}
};
return view;
}
Link 错误图片:
出现你说的现象是因为listview items被回收了,为了保证正确的行为,获取view对象后检查item.LIKE是否为真,如果为真,改变颜色,否则显示正常颜色
public override View GetView(int position,View convertView,ViewGroup parent)
{
var item = (Tips)this.GetItem(position);
View view = convertView;
if (view == null)
{
view = this.activity.LayoutInflater.Inflate(Resource.Layout.list_item_Tips, null);
}
var TextTitle = view.FindViewById<TextView>(Resource.Id.titletxt);
TextTitle.Text = item.TITLE;
var TextWriter = view.FindViewById<TextView>(Resource.Id.contenttxt);
TextContent.Text = item.CONTENT;;
if(item.LIKE)
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
}
else
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_normal);
}
view.FindViewById<ImageButton>(Resource.Id.Like).Click += (sender, e) =>
{
view.FindViewById<ImageButton>(Resource.Id.Like).SetImageResource(Resource.Drawable.ic_liked);
item.LIKE = true;
item.LIKE_COUNT++;
view.FindViewById<TextView>(Resource.Id.like_count).Text = item.LIKE_COUNT.ToString();
NotifyDataSetChanged();
}
};
return view;
}
代码可能不正确,我不熟悉 Xamarin 语法
出现此问题是因为视图行未正确回收,因此引用了错误的视图行。使用 viewholder class 声明所有控件并将此 class 的实例标记到每一行。
例如:
public override View GetView (int position, View convertView, ViewGroup parent)
{
View rowView = convertView;
//reuse view
if (rowView == null) {
rowView = _context.LayoutInflater.Inflate (Resource.Layout.ItemCustomLayout, parent, false);
viewHolder = new ViewHolderItem ();
viewHolder.txtTemName = rowView.FindViewById<TextView>(Resource.Id.lblItemName);
rowView.Tag = viewHolder; //attaching viewholder reference to row
}
else
{
viewHolder = (ViewHolderItem)rowView.Tag; //during row re-use get the instance of the view holder
}
viewHolder.txtTemName.Text = strX;
return rowView;
}
//视图持有者class
class ViewHolderItem :Java.Lang.Object
{
internal TextView txtTemName;
}
在此处查找更多详细信息:http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#ViewHolderTag