2016-09-06 3 views
6

I 항목 목록을 표시하기 위해 RecyclerView를 사용하고 있으며 위치별로 단일 항목의 상태를 업데이트해야합니다. (이 업데이트를notifyItemChanged (int position) RecyclerView의 여러 항목을 업데이트합니다.

myList.set(position, newModifiedItem); 
notifyItemChanged(position); 

아이템이 무작위로 다른 항목을 업데이트도 성공적으로 업데이트되지만, 때마다 나는 내 아이템 목록을 아래로 스크롤 : 나는 다음과 같이 notifyItemChanged(int position)를 호출 목록에 내 아이템을 업데이트하고 다른 아이콘 상태)도 다른 항목들에 만들어집니다.

목록 항목을 위치별로 확인하고 다른 상태로 설정하기로 한 onBindViewHolder에서 변경하고 있습니다.

전체 어댑터 코드 :

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private List<MyObj> myList; 

    public MyAdapter(List<MyObj> list) { 
     this.myList = list; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item, parent, false); 
     return new ViewHolder(view); 
    } 

    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     MyObj myObj = myList.get(position); 
     boolean isSpecial = myObj.getMySpecialStatus(); 

     holder.myItemTitle.setText(myObj.getTitle()); 

     //decide if item has different icon state 
     if (isSpecial) { 
      holder.myItemIcon.setImageResource(R.drawable.ic_special);  
     } 
    } 

    @Override 
    public int getItemCount() { 
     return myList.size(); 
    } 


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView myItemTitle; 
     public ImageView myItemIcon; 
     public LinearLayout itemClickable; 
     //some other views 

     public ViewHolder(View itemView) { 
      super(itemView); 
      myItemTitle = (TextView) itemView.findViewById(R.id.item_title); 
      myItemIcon = (ImageView) itemView.findViewById(R.id.item_img); 

      itemClickable = (LinearLayout) itemView.findViewById(R.id.item_clickable_zone); 
      itemClickable.setOnClickListener(this); 

      //some other views 
     } 

     @Override 
     public void onClick(View v) { 
      final int position = getAdapterPosition(); 
      if (position != RecyclerView.NO_POSITION) { 

       switch (v.getId()) { 
        case R.id.item_clickable_zone: { 

         //some logic to change status - here just an idea 
         MyObj newModifiedItem = myList.get(position); 
         newModifiedItem.setMySpecialStatus(true); 

         myList.set(position, newModifiedItem); 
         notifyItemChanged(position); 
         break; 
        } 

        //some other views on click 
       } 
      } 
     } 
    } 
} 
+0

이것은 제목에서도 마찬가지입니까? –

+0

@Dharmbir Singh 제목이 그대로 유지 –

+0

전체 어댑터 코드를 게시하십시오. – MalhotraUrmil

답변

2

문제는 당신 onBindViewHolder()입니다. 그것은 다음과 같을 것입니다 :

public void onBindViewHolder(final ViewHolder holder, final int position) { 
     MyObj myObj = myList.get(position); 
     boolean isSpecial = myObj.getMySpecialStatus(); 

     holder.myItemTitle.setText(myObj.getTitle()); 

     //decide if item has different icon state 
     if (isSpecial) { 
      holder.myItemIcon.setImageResource(R.drawable.ic_special);  

     } else { 
      //here is the trick - set normal state back 
      holder.myItemIcon.setImageResource(R.drawable.ic_standard); 
     } 
    } 
1

이 시도, 당신은 ifelse 케이스를 사용하지 않은 경우

MyObj newModifiedItem = myList.get(position); //getting object from the list 
newModifiedItem.setMySpecialStatus(true); 
notifyItemChanged(position, newModifiedItem); 
+0

시간을 주셔서 감사합니다 Logged ,하지만 이것은 정확히 내가 이미 성공하지 못했던 것과 같습니다. –

+0

boolean isSpecial = myObj.getMySpecialStatus();를 최종 부울로 바꿀 수 있습니까? isSpecial = myObj.getMySpecialStatus(); – Pandiarajan

관련 문제