android - 在 Recyclerview 中点击一个项目会影响每七个项目吗?

标签 android xamarin android-recyclerview android-adapter

我有一个 Recyclerview,在每个项目中,我放了 2 个名为 IncementBtn nad DecrementBtn 的按钮来递增和递减 ListOrders 中的项目。还有一个显示项目编号的 Textview。Recyclerview 在 vi​​ewpager 中,每个页面的寻呼机相关到 ViewPager 选项卡。当我点击 incrementBtn 再增加一个数量时,第七个位置也发生了变化,并将数量显示为点击的项目。 当我点击一个项目时,一切都很好,第七个项目也受到影响。

 public class SimpleStringRecyclerViewAdapter : RecyclerView.Adapter
            {
                private readonly TypedValue mTypedValue = new TypedValue();
                private int mBackground;
                private List<Food> mValues;
                Resources mResource;
                private Dictionary<int, int> mCalculatedSizes;

                public SimpleStringRecyclerViewAdapter(Context context, List<Food> items, Resources res)
                {
                    context.Theme.ResolveAttribute(Resource.Attribute.selectableItemBackground, mTypedValue, true);
                    mBackground = mTypedValue.ResourceId;
                    mValues = items;
                    mResource = res;

                    mCalculatedSizes = new Dictionary<int, int>();
                }

                public override int ItemCount
                {
                    get { return mValues.Count; }
                }

                public override async void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
                {
                    var simpleHolder = holder as SimpleViewHolder;

                    //simpleHolder.mBoundString = mValues[position].;
                    simpleHolder.mFoodNameTxt.Text = mValues[position].Name;
                    simpleHolder.mPriceTxt.Text = mValues[position].Price.ToString();
                    simpleHolder.foodId = mValues[position].FoodId;
                    simpleHolder.position = position;

                }

                public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
                {

                    View view = LayoutInflater.From(parent.Context)
                        .Inflate(Resource.Layout.food_list_item, parent, false);
                    view.SetBackgroundResource(mBackground);

                    return new SimpleViewHolder(view);
                }
            }

            public class SimpleViewHolder : RecyclerView.ViewHolder
            {
                public string mBoundString;
                public  View mView;
                public  ImageView mImageView;
                public  TextView mFoodNameTxt;
                public  TextView mPriceTxt;
                public  Button mIncrementBtn;
                public  Button mDcrementBtn;
                public  TextView _quantitiyTxt;
                public int foodId;
                private static int quntitySum = 0;
                public int position;
                public SimpleViewHolder(View view) : base(view)
                {
                    mView = view;


                    //mImageView = view.FindViewById<ImageView>(Resource.Id.avatar);
                    mFoodNameTxt = view.FindViewById<TextView>(Resource.Id.lbl_food_name);
                    mPriceTxt = view.FindViewById<TextView>(Resource.Id.lbl_price);

                    mIncrementBtn = view.FindViewById<Button>(Resource.Id.increment_btn);
                    _quantitiyTxt = view.FindViewById<TextView>(Resource.Id.quantity_txt);

                    mDcrementBtn = view.FindViewById<Button>(Resource.Id.decrement_btn);

                    mDcrementBtn.Click += delegate
                    {

                        //Find order and decrement
                        var orderItem = orderList.Find(p => p.FoodId == foodId);
                        orderItem.Quantity--;
                        _quantitiyTxt.Text = orderItem.Quantity.ToString();
                        _fabCart.SetImageBitmap(ConvertTextToBitmap.TextAsBitmap((--quntitySum).ToString(), 36, Color.White));

                        if (orderItem.Quantity == 0)
                        {
                            mDcrementBtn.Visibility = ViewStates.Invisible;
                            _quantitiyTxt.Visibility = ViewStates.Invisible;
                            _quantitiyTxt.Text = "";
                            orderList.Remove(orderItem);
                        }
                        if (orderList.Count == 0)
                        {
                            _fabCart.Visibility = ViewStates.Gone;
                        }

                    };

                    mIncrementBtn.Click += delegate
                    {

                        _fabCart.Show();
                        mDcrementBtn.Visibility = ViewStates.Visible;
                        _quantitiyTxt.Visibility = ViewStates.Visible;
                        if (orderList.Any(p=>p.FoodId==foodId))
                        {
                            //Find order and increment
                            var orderItem = orderList.Find(p => p.FoodId == foodId);
                            orderItem.Quantity++;
                            _quantitiyTxt.Text = orderItem.Quantity.ToString();

                        }
                        else
                        {

                            orDetail = new Order
                            {
                                FoodId = foodId,
                                FoodName = mFoodNameTxt.Text,
                                Price = Convert.ToInt32(mPriceTxt.Text)
                            };
                            orDetail.Quantity++;
                            orderList.Add(orDetail);
                            _quantitiyTxt.Text = orDetail.Quantity.ToString();

                        }

                        _fabCart.SetImageBitmap(ConvertTextToBitmap.TextAsBitmap((++quntitySum).ToString(), 36, Color.White));

                    };


                }


                public override string ToString()
                {
                    return base.ToString() + " '" + mFoodNameTxt.Text;
                }
            }

我哪里错了? 请帮助克服这个问题。

我有一张有趣的图片来说明问题。 enter image description here

最佳答案

在设置 recyclerView 时尝试为 recyclerView 设置 ItemCachedSize。

YourRecyclverView.setAdapter(matchItemAdapter);
YourRecyclverView.setNestedScrollingEnabled(false);
YourRecyclverView.setLayoutManager(layoutManager);
YourRecyclverView.setItemViewCacheSize(100);

我遇到了这个错误并通过将 Item 缓存 View 设置为 100 来解决。

关于android - 在 Recyclerview 中点击一个项目会影响每七个项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979330/

相关文章:

android - 定点数学 - 从浮点安全到总是产生相同结果的转换?

ios - Xamarin.ios 点击屏幕时关闭 UIAlertController ActionSheet

c# - 检索设备的 IP 地址

visual-studio-2013 - 没有安装的预配配置文件与使用 Visual Studio 在 Xamarin 中安装的 iOS 代码签名 key 匹配

android - 错误的文本颜色绑定(bind)到 Viewholder

java - 无论我做什么,DividerItemDecoration 都不起作用

android - 当行宽等于 TextView 的宽度时,为什么 TextView 会断行

android - 在线性布局中将焦点从父级传递给子级

android - ConnectivityManager cm =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE)

android - 使用 Firebase 检测 RecyclerView 项目中的删除