2016-09-22 3 views
0

저는 RecyclerView이며, 스크롤 한 후 내 adapter에있는 항목의 값이 바뀌고 있습니다. 이는 분명히 기본 데이터가 지워지지 않는 상태에서 뷰를 재활용 할 때의 문제입니다.RecyclerView 인덱스가 엉망입니다

그러나이 질문에 대한 수십 번의 반복을 읽었지 만 답변에서 명확한 수정을 판독 할 수 없어 내 문제가 계속되고 있습니다.

나는 getItem, getItemIdgetItemCount 방법을 무시 안정 ID가하는 Adapter을 설정하고 있어요 - 내가 생각 - 내 데이터가 깨끗한 지 아닌지 알 내 onBindViewHolder 방법에 정확한 검사를 수행 ...하지만 이 마지막 부분은 나에게 혼란 스럽다. 내가 조건부로 수행해야 할 부분에 대해 확신이 서지 않는다. (이 질문들에 대한 답변의 대부분이 부족하다고 느낀다.) ...

다음은 관련 코드이다.

public class MenuQueryAdapter extends ParseRecyclerQueryAdapter<MenuItem, MenuQueryAdapter.MenuViewHolder> { 

    public MenuQueryAdapter(ParseQueryAdapter.QueryFactory<MenuItem> factory, boolean hasStableIds) { 
     super(factory, hasStableIds);// hasStableIds set to TRUE 
    } 


    @Override 
    public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new MenuViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_item, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(MenuViewHolder holder, int position) { 
     MenuItem menuItem = getItem(position); 
     holder.bindItem(menuItem); 
    } 

    @Override 
    public MenuItem getItem(int position) { 
     //return super.getItem(position); 
     if (menuItemList != null && menuItemList.size() > 0) { 
      return menuItemList.get(position); 
     } 
     return super.getItem(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


    // View Holder 
    public static class MenuViewHolder extends RecyclerView.ViewHolder { 

     MenuItem menuItem; 

     TextView title; 
     TextView price; 
     TextView summary; 
     TextView itemCount; 

     TextView calorieLabel; 
     TextView proteinLabel; 
     TextView fatLabel; 
     TextView carbsLabel; 
     TextView fiberLabel; 

     ParseImageView imageView; 

     private String objectId = ""; 
     private boolean active = true; 
     private boolean inStock = true; 
     private boolean cSoon = false; 
     private boolean hasNutrition = false; 


     MenuViewHolder(View itemView) { 
      super(itemView); 

      title = (TextView) itemView.findViewById(R.id.menu_title_label); 
      price = (TextView) itemView.findViewById(R.id.menu_price_label); 
      summary = (TextView) itemView.findViewById(R.id.menu_summary); 

      calorieLabel = (TextView) itemView.findViewById(R.id.menu_label_calorie_value); 
      proteinLabel = (TextView) itemView.findViewById(R.id.menu_label_protein_value); 
      fatLabel = (TextView) itemView.findViewById(R.id.menu_label_fat_value); 
      carbsLabel = (TextView) itemView.findViewById(R.id.menu_label_carbs_value); 
      fiberLabel = (TextView) itemView.findViewById(R.id.menu_label_fibre_value); 

      imageView = (ParseImageView) itemView.findViewById(R.id.menu_main_image); 

      // Containers 
      final RelativeLayout activeView = (RelativeLayout) itemView.findViewById(R.id.menu_top_view_active); 
      final RelativeLayout inactiveView = (RelativeLayout) itemView.findViewById(R.id.menu_top_view_inactive); 

      View.OnClickListener clickListener = new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        active = !active; 
        if(active) 
        { 
         activeView.setVisibility(View.VISIBLE); 
         inactiveView.setVisibility(View.INVISIBLE); 
        } 
        else 
        { 
         activeView.setVisibility(View.INVISIBLE); 
         inactiveView.setVisibility(View.VISIBLE); 
        } 
       } 
      }; 

      final RelativeLayout topView = (RelativeLayout) itemView.findViewById(R.id.menu_top_view); 
      topView.setOnClickListener(clickListener); 

      final ImageButton info = (ImageButton) itemView.findViewById(R.id.menu_info_button); 
      info.setOnClickListener(clickListener); 

     } 

     public void bindItem(MenuItem item) { 
      menuItem = item; 

      menuItem.populateData(); // gets data from DB 

      // THIS IS MY CHECK TO SEE IF THE DATA SHOULD EB RECYCLED 
      if(!menuItem.getTitle().equals(enroot.getContext().getResources().getString(R.string.menu_title))) { 
       title.setText(menuItem.getTitle()); 
       price.setText(String.valueOf(menuItem.getPrice())); 
       summary.setText(menuItem.getSummary()); 
       calorieLabel.setText(menuItem.getCalories()); 
       proteinLabel.setText(menuItem.getProtein()); 
       fatLabel.setText(menuItem.getFat()); 
       carbsLabel.setText(menuItem.getCarbs()); 
       fiberLabel.setText(menuItem.getFibre()); 
       imageView.setParseFile(menuItem.getImage()); 
       imageView.loadInBackground(); 

       if (menuItem.getInt(EnrootConstants.kERItemInStockKey) <= 0) { 
        inStock = false; 
       } 
       if (menuItem.getBoolean(EnrootConstants.kERItemComingSoonKey) && inStock) { 
        cSoon = true; 
       } 
       if (menuItem.getList(EnrootConstants.kERItemNutritionKey) != null && menuItem.getList(EnrootConstants.kERItemNutritionKey).size() > 0) { 
        hasNutrition = true; 
       } 

       // Id 
       objectId = menuItem.getObjectId(); 
       if (mOnItemChangedListener != null) { 
        mOnItemChangedListener.passIdToActivity(objectId); 
       } 

       // Stock 
       RelativeLayout ooStock = (RelativeLayout) itemView.findViewById(R.id.menu_soldout); 
       if (!inStock) { 
        ooStock.setVisibility(View.VISIBLE); 
       } 

       // Coming Soon 
       RelativeLayout comingSoon = (RelativeLayout) itemView.findViewById(R.id.menu_comingsoon); 
       if (cSoon) { 
        comingSoon.setVisibility(View.VISIBLE); 
       } 

       // Nutrition 
       if (!hasNutrition) { 
        RelativeLayout nutritionOverlay = (RelativeLayout) itemView.findViewById(R.id.menu_nutrition_group); 
        nutritionOverlay.setVisibility(View.INVISIBLE); 
       } 

       // Minus 
       final ImageButton minus = (ImageButton) itemView.findViewById(R.id.menu_btn_minus); 
       if (inStock && !cSoon) { 
        minus.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          if (mOnItemChangedListener != null) { 
           mOnItemChangedListener.onPriceSubtracted(objectId, getAdapterPosition()); 
          } 
         } 
        }); 
       } else { 
        minus.setVisibility(View.INVISIBLE); 
        minus.setEnabled(false); 
        minus.setClickable(false); 
       } 

       // Plus 
       final ImageButton plus = (ImageButton) itemView.findViewById(R.id.menu_btn_plus); 
       if (inStock && !cSoon) { 
        plus.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          if (mOnItemChangedListener != null) { 
           mOnItemChangedListener.onPriceAdded(objectId, getAdapterPosition()); 
          } 
         } 
        }); 
       } else { 
        plus.setVisibility(View.INVISIBLE); 
        plus.setEnabled(false); 
        plus.setClickable(false); 
       } 
      } 
      else { 
       clearItem(); 
      } 
     } 

     void clearItem() { 

      title.setText(""); 
      price.setText(""); 
      summary.setText(""); 
      calorieLabel.setText(""); 
      proteinLabel.setText(""); 
      fatLabel.setText(""); 
      carbsLabel.setText(""); 
      fiberLabel.setText(""); 

      objectId = ""; 
      active = true; 
      inStock = true; 
      cSoon = false; 
      hasNutrition = false; 

     } 

    } /* eoc holder */ 

    } /* eoc adapter */ 

그래서 ... getItem 및/또는 getItemId (Stable Id가있는 경우 의미가 있음)을 단순히 무시하는 것에 대해 많은 이야기를하지만 효과가없는 것 같습니다. ViewHolder에서 setIsRecyclable을 false로 설정해도 효과가 없습니다.

내가 무섭게 뭔가를 잘못하고 있어요 경우 듣고 싶어요 ... 붙어있어 ...

+0

를 계산 반환 놓친 생각 당신의 타이틀 조건이 실패하면. 또한 현재 제목이 정적 제목과 비교되는 것이 이상하다고 판단되는 제목 상태를 확인하십시오. – nenick

+0

정적 제목과의 비교는 XML보기의 텍스트로 해당 문자열 리소스를 사용하기 때문입니다. null로 설정하면 해당 텍스트를 볼 수 없으므로 placeholder가됩니다. TextUtils.isEmpty() 등 –

+0

그래서 ... 항상 명확한가요? 그런 다음 어떤 조건에서 내 데이터 객체의 값을 설정합니까? –

답변

0

난 당신이 항목 대신에만 항상 clearItem 전화를보십시오

@Override 
public int getItemCount() { 
    return menuItemList.size(); 
} 
+0

아니요, 그게 아니예요 - 이것은 어댑터와 리사이클 뷰 사이에있는 클래스입니다. –