저는 RecyclerView
이며, 스크롤 한 후 내 adapter
에있는 항목의 값이 바뀌고 있습니다. 이는 분명히 기본 데이터가 지워지지 않는 상태에서 뷰를 재활용 할 때의 문제입니다.RecyclerView 인덱스가 엉망입니다
그러나이 질문에 대한 수십 번의 반복을 읽었지 만 답변에서 명확한 수정을 판독 할 수 없어 내 문제가 계속되고 있습니다.
나는 getItem
, getItemId
및 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가있는 경우 의미가 있음)을 단순히 무시하는 것에 대해 많은 이야기를하지만 효과가없는 것 같습니다. ViewHolder
에서 setIsRecyclable
을 false로 설정해도 효과가 없습니다.
내가 무섭게 뭔가를 잘못하고 있어요 경우 듣고 싶어요 ... 붙어있어 ...
를 계산 반환 놓친 생각 당신의 타이틀 조건이 실패하면. 또한 현재 제목이 정적 제목과 비교되는 것이 이상하다고 판단되는 제목 상태를 확인하십시오. – nenick
정적 제목과의 비교는 XML보기의 텍스트로 해당 문자열 리소스를 사용하기 때문입니다. null로 설정하면 해당 텍스트를 볼 수 없으므로 placeholder가됩니다. TextUtils.isEmpty() 등 –
그래서 ... 항상 명확한가요? 그런 다음 어떤 조건에서 내 데이터 객체의 값을 설정합니까? –