Listview与imagebutton糟糕的工作

时间:2015-06-27 09:05:56

标签: android listview xamarin xamarin.android android-imagebutton

我在listview的每一行都有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;
        }

链接错误图片:

Clicked Img

Scrolled Down Img

2 个答案:

答案 0 :(得分:1)

出现此问题是因为View行未正确回收,因此引用了错误的视图行。使用viewholder类声明所有控件并将此类的实例标记到每一行。

对于Ex:

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 ViewHolderItem :Java.Lang.Object
        {
         internal   TextView txtTemName; 
        }

在此处查找更多详情:http://appliedcodelog.blogspot.in/2015/07/working-on-issues-with-listview-in.html#ViewHolderTag

答案 1 :(得分:0)

您提到的现象是因为listview项目被回收,以确保正确的行为,在获取视图对象后检查item.LIKE是否为true,如果为true,则更改颜色,否则显示正常颜色

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语法