2016-09-06 4 views
6

で複数の項目を更新し、Iは位置によって、単一のアイテムの状態を更新する必要があります。 (このアップデートをnotifyItemChanged(INT位置)Iは、項目のリストを表示するためRecyclerViewを使用してい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

、これを試してみてください。それは次のようになります:

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

問題は、あなたがif文のelseケースを使用していない、あなたのonBindViewHolder()である

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

扱うことができるかわからない無成功でそれを試してみましたが、これは、私はすでになし成功 –

+0

で使用するとまったく同じであるあなたが変更することができますブールisSpecial = myObj.getMySpecialStatus();最後のブール値にisSpecial = myObj.getMySpecialStatus(); – Pandiarajan

関連する問題