Xamarin Android中如何消除Adapter指定位置的空视图
解决Xamarin Android Adapter中空视图问题
你的问题核心是只设置了目标控件的可见性,未对不需要的控件设置隐藏,再加上Adapter的视图复用机制,导致旧视图状态残留,出现空占位。按以下方式修改代码即可解决:
- 初始化控件后先统一设置所有控件为隐藏状态,避免复用残留
- 根据id判断显示哪一组控件,同时绑定对应数据
- 修正ViewHolder实例化的笔误(原代码里
new Myadapter()应该是自定义的ViewHolder类)
修改后的完整代码:
view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Myadapter, parent, false); var desc = view.FindViewById<TextView>(Resource.Id.OrderedDesc); var OrderedQty = view.FindViewById<TextView>(Resource.Id.OrderedQty); var x = view.FindViewById<TextView>(Resource.Id.x); var newOrderedDesc = view.FindViewById<TextView>(Resource.Id.newOrderedDesc); var newQty = view.FindViewById<TextView>(Resource.Id.newitemQty); // 先默认隐藏所有控件,消除复用残留 desc.Visibility = ViewStates.Gone; OrderedQty.Visibility = ViewStates.Gone; x.Visibility = ViewStates.Gone; newOrderedDesc.Visibility = ViewStates.Gone; newQty.Visibility = ViewStates.Gone; var itemId = MyConvert.ToInt32(Getitem[position].id); if (itemId == 19) { // 显示新控件组并绑定数据 x.Visibility = ViewStates.Visible; newOrderedDesc.Visibility = ViewStates.Visible; newQty.Visibility = ViewStates.Visible; newOrderedDesc.Text = Getitem[position].Description.Trim(); newQty.Text = MyConvert.ToString(Getitem[position].Quantity).Trim(); } else { // 显示旧控件组并绑定数据 desc.Visibility = ViewStates.Visible; OrderedQty.Visibility = ViewStates.Visible; desc.Text = Getitem[position].Description.Trim(); OrderedQty.Text = MyConvert.ToString(Getitem[position].Quantity).Trim(); } // 替换为你的实际ViewHolder类,原代码里的Myadapter是笔误 view.Tag = new MyViewHolder() { desc = desc, OrderedQty = OrderedQty, newOrderedDesc = newOrderedDesc, newQty = newQty };
注:使用ViewStates.Gone而非Invisible,因为前者会完全移除控件的布局占位,彻底避免空视图问题。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

