2017-12-26 3 views
-1

각 항목에 IncementBtn nad DecrementBtn이라는 2 개의 버튼을 추가하여 항목 수를 나타내는 ListOrders.And Textview의 항목을 증가 및 감소시킵니다. Recyclerview는 뷰 페이지 및 관련 페이저의 각 페이지에 있습니다. ViewPager 탭. incrementBtn을 클릭하여 수량을 한 번 더 추가하고 일곱 번째 위치도 변경 한 다음 수량을 클릭 된 항목으로 표시합니다. 항목을 클릭했을 때 모든 것이 좋으며 일곱 번째 항목도 영향을받습니다.일곱 번째 항목마다 Recyclerview 효과의 항목을 클릭하십시오?

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

+0

이는 recyclerView이기 때문에 반복적으로 뷰를 재활용합니다. [이 게시물] (https://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items)을 참조로 확인할 수 있습니다. –

+0

정적 행에 대해 CachingStrategy = "RecycleView"를 권장합니다 , 그냥 바인딩 값을 새로 고치십시오, 당신은 모든 컨트롤을 시작하고 단지 수량을 표시해야합니다. – katxalot

+0

@ MuratGuc 감사합니다. 그러나 저에게 의미가 없습니다. –

답변

0

@ jon-douglas가 말하기를,이 코드를 OnBindViewHolder에 추가하여 버그를 수정했습니다.

simpleHolder.mDcrementBtn.Visibility = ViewStates.Invisible; 
simpleHolder._quantitiyTxt.Visibility = ViewStates.Invisible; 
simpleHolder._quantitiyTxt.Text = ""; 

var item = orderList.Find(p => p.FoodId == mValues[position].FoodId); 
if (item != null && item.ClickFlag) 
{ 
    simpleHolder.mDcrementBtn.Visibility = ViewStates.Visible; 
    simpleHolder._quantitiyTxt.Visibility = ViewStates.Visible; 
    simpleHolder._quantitiyTxt.Text = item.Quantity.ToString(); 
} 
관련 문제