Java 向上滚动时列表视图不保持颜色

Java 向上滚动时列表视图不保持颜色,java,android,xamarin,Java,Android,Xamarin,我正在使用listview自定义适配器,通过行单击,我正在更改行颜色。但是当我再次滚动机器人时,它没有正确的位置。 它会更改其他行中的颜色 public override View GetView(int position, View convertView, ViewGroup parent) { DataViewHolder holder = null; if (convertView == null)

我正在使用listview自定义适配器,通过行单击,我正在更改行颜色。但是当我再次滚动机器人时,它没有正确的位置。 它会更改其他行中的颜色

public override View GetView(int position, View convertView, ViewGroup parent)
        {
            DataViewHolder holder = null;
            if (convertView == null)
            {
                convertView = LayoutInflater.From(mContext).Inflate(Resource.Layout.TableItems, null, false);
                holder = new DataViewHolder();
                holder.txtDescription = convertView.FindViewById<TextView>(Resource.Id.txtDescription);

                holder.txtDescription.Click += delegate
                {
                    holder.txtDescription.SetBackgroundColor(Color.Red);
                };
                convertView.Tag = holder;
            }
            else
            {
                holder = convertView.Tag as DataViewHolder;
            }
            holder.txtDescription.Text = mitems[position].Description;

            return convertView;
        }
        public class DataViewHolder : Java.Lang.Object
        {
            public TextView txtDescription { get; set; }

        }
public override View GetView(int位置、视图转换视图、视图组父视图)
{
DataViewHolder=null;
if(convertView==null)
{
convertView=LayoutInflater.From(mContext).Inflate(Resource.Layout.TableItems,null,false);
holder=新的DataViewHolder();
holder.txtDescription=convertView.findviewbyd(Resource.Id.txtDescription);
holder.txtDescription.Click+=委托
{
支架.txtDescription.SetBackgroundColor(颜色.红色);
};
convertView.Tag=holder;
}
其他的
{
holder=convertView.Tag作为DataViewHolder;
}
holder.txtDescription.Text=mitems[position]。说明;
返回视图;
}
公共类DataViewHolder:Java.Lang.Object
{
公共文本视图txtDescription{get;set;}
}

看起来它并没有保存在内存中特定的行位置

不要直接更改单击处理程序中的颜色,而是更改适配器从中绘制的数据,并在再次调用GetView时使用该数据更改颜色

ListView
回收用于优化滚动的视图,而只是希望视图表示数据。如果您直接更改一个视图的颜色,该视图将被回收,您将看到具有不同背景颜色的“另一个视图”(数据的另一部分)

总之:给每个数据点一个颜色属性,并使用该属性在
GetView
中设置每个视图的颜色,更改数据并通知适配器数据的更改

编辑

我从来没有用过Xamarin,但也许像这样的药会管用

public override View GetView(int position, View convertView, ViewGroup parent)
{
    DataViewHolder holder = null;
    if (convertView == null)
    {
        convertView = LayoutInflater.From(mContext).Inflate(Resource.Layout.TableItems, null, false);
        holder = new DataViewHolder();
        holder.txtDescription = convertView.FindViewById<TextView>(Resource.Id.txtDescription);

        holder.txtDescription.Click += delegate
        {
            // instead of setting the color directly here, just modify the data
            (holder.txtDescription.Tag as ItemType).ItemColor = Color.Red
            notifyDataSetChanged();
        };
        convertView.Tag = holder;
    }
    else
    {
        holder = convertView.Tag as DataViewHolder;
    }
    holder.txtDescription.Text = mitems[position].Description;
    holder.txtDescription.Tag = mitems[position];  // this so that the click handler knows which item to modify
    holder.txtDescription.SetBackgroundColor(mitems[position].ItemColor);

    return convertView;
}

public class DataViewHolder : Java.Lang.Object
{
    public TextView txtDescription { get; set; }
}
public override View GetView(int位置、视图转换视图、视图组父视图)
{
DataViewHolder=null;
if(convertView==null)
{
convertView=LayoutInflater.From(mContext).Inflate(Resource.Layout.TableItems,null,false);
holder=新的DataViewHolder();
holder.txtDescription=convertView.findviewbyd(Resource.Id.txtDescription);
holder.txtDescription.Click+=委托
{
//不要直接在这里设置颜色,只需修改数据即可
(holder.txtDescription.Tag作为ItemType)。ItemColor=Color.Red
notifyDataSetChanged();
};
convertView.Tag=holder;
}
其他的
{
holder=convertView.Tag作为DataViewHolder;
}
holder.txtDescription.Text=mitems[position]。说明;
holder.txtDescription.Tag=mitems[position];//这样单击处理程序就知道要修改哪个项
holder.txtDescription.SetBackgroundColor(mitems[position].ItemColor);
返回视图;
}
公共类DataViewHolder:Java.Lang.Object
{
公共文本视图txtDescription{get;set;}
}

ListView
将重用项目布局,您可以使用
List
View.Tag
来避免重用引起的问题


我已经发布了我的演示。

移动单击外部
,否则它不起作用。这就像没有保持正确的项目可见性位置移动单击外部
if else
,如果要在
VISIBLE/GONE
之间切换,则必须检查上一个状态切换到相反的状态。是否要检查convertView?或者holder.BotLinear.Visibility?我应该在它的位置上使用标签吗?
holder.BotLinear.Visibility
。你能给我举个例子吗?有什么帮助吗