2016-09-22 11 views
0

私はRecyclerViewを持っています。スクロールした後、私のadapterのアイテムの値が入れ替わっています。これは明らかに、元のデータがクリアされていないビューのリサイクルに関する問題です。RecyclerViewがインデックスを乱す

しかし、私はこの質問の反復を何十回も読んだことがありますが、回答のいずれかから明確な修正を解読することができず、私の問題は持続しています。

私はgetItemgetItemId、およびgetItemCountメソッドをオーバーライドし、安定した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を持っていると意味があります)を単に上書きすることに関して多くの話がありますが、それは効果がないようです。私はViewHoldersetIsRecyclableをfalseに設定しても効果はありません。

私がこだわっている...私はものすごく何か間違ったことをやっている場合は聞くのが大好きだ...

+0

だけではなく、常にclearItemを呼び出して試してみてくださいをカウント返すために逃したと思いますあなたのタイトル条件が失敗した場合。また、現在のタイトルが静的なタイトルと比較されることが奇妙に見えるタイトル条件を確認します。 – nenick

+0

静的タイトルとの比較は、その文字列リソースをXMLビューのテキストとして使用するためです。これをnullに設定した場合は表示できなくなるため、プレースホルダになります。 TextUtils.isEmpty()など –

+0

これは...常にクリアされていますか?次に、私のデータオブジェクトの値を設定する条件は? –

答えて

0

私はあなたの項目が

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

いいえ、それはそうではありません - これは私のアダプタとリサイクラビューの間にあるクラスです。 –

関連する問題