我正在使用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; }
}
看起来它没有保留在内存特定的行情况。
答案 0 :(得分:0)
不要直接更改点击处理程序中的颜色,而是更改适配器从中获取的数据,并在再次调用GetView时使用它来更改颜色。
auto start = std::chrono::steady_clock::now();
std::future<void> futureRet = std::async(std::launch::async, &Someone::doSomething, this);
futureRet.wait_for(std::chrono::seconds(30));
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
cout << "doSomething returned after <" << elapsed_seconds.count() << "> seconds.";
回收它用来优化滚动的视图,而只是期望视图代表数据。如果您直接更改一个视图的颜色,则视图会被回收,您将看到另一个视图&#34; (另一部分数据)具有不同的背景颜色。
总结:给每个数据点一个颜色属性,并使用它来设置ListView
中每个视图的颜色,更改数据并通知适配器有关数据更改的信息。
修改强>
我从未使用过Xamarin,但也许这样的事情会起作用
GetView
答案 1 :(得分:0)
ListView
将重复使用项目布局,您可以使用List
和View.Tag
来避免因重复使用而导致的问题。
我已在github上发布了我的演示。