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

时间:2018-04-09 08:12:16

标签: java android xamarin

我正在使用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; }

        }

看起来它没有保留在内存特定的行情况。

2 个答案:

答案 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将重复使用项目布局,您可以使用ListView.Tag来避免因重复使用而导致的问题。

我已在github上发布了我的演示。