Java 向上滚动时列表视图不保持颜色
我正在使用listview自定义适配器,通过行单击,我正在更改行颜色。但是当我再次滚动机器人时,它没有正确的位置。 它会更改其他行中的颜色Java 向上滚动时列表视图不保持颜色,java,android,xamarin,Java,Android,Xamarin,我正在使用listview自定义适配器,通过行单击,我正在更改行颜色。但是当我再次滚动机器人时,它没有正确的位置。 它会更改其他行中的颜色 public override View GetView(int position, View convertView, ViewGroup parent) { DataViewHolder holder = null; if (convertView == null)
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
。你能给我举个例子吗?有什么帮助吗