2016-11-08 8 views
0

私はリサイクルビューを持っています。そして、アイテムがクリックされたときにその背景を変更したい。 私のコードでは、クリックされたアイテムは変更されますが、スクロールすると、背景も変更されたアイテムもあります。スクロールバックすると、初期アイテムの背景がデフォルトに戻ります。RecyclerView - スクロールするときに重複し、アイテムがタッチされたときにアイテムの背景が変更されます。

はここに私のアダプタです:

パブリッククラスMyCustomAdapterがRecyclerView.Adapter {

private Context context; 

private ArrayList<Information> data; 

private LayoutInflater inflater; 

private int previousPosition = 0; 

private Resources resources; 

private Drawable drawable; 

public MyCustomAdapter(Context context, ArrayList<Information> data) { 

    this.context = context; 
    this.data = data; 
    inflater = LayoutInflater.from(context); 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int position) { 

    View view = inflater.inflate(R.layout.list_item_row, parent, false); 

    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(final MyViewHolder myViewHolder, final int position) { 

    myViewHolder.textView1.setText(data.get(position).title); 
    //myViewHolder.imageView.setImageResource(data.get(position).imageId); 

    if(position > previousPosition){ // We are scrolling DOWN 

     AnimationUtil.animate(myViewHolder, true); 

    }else{ // We are scrolling UP 

     AnimationUtil.animate(myViewHolder, false); 
    } 

    previousPosition = position; 

    final int currentPosition = position; 
    final Information infoData = data.get(position); 


    myViewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(context, "Onlick Called at position "+position, Toast.LENGTH_LONG).show(); 
      //myViewHolder.imageView.setImageResource(data.get(position).imageId); 
      resources = context.getResources(); 
      drawable = resources.getDrawable(data.get(position).imageId); 
      myViewHolder.relativeLayout.setBackground(drawable); 
     } 
    }); 

} 

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

class MyViewHolder extends RecyclerView.ViewHolder{ 

    TextView textView1; 
    TextView textView2; 
    CardView cardView; 
    ImageView imageView; 
    RelativeLayout relativeLayout; 


    public MyViewHolder(View itemView) { 
     super(itemView); 
     textView1 = (TextView) itemView.findViewById(R.id.card_front_text1); 
     textView2 = (TextView) itemView.findViewById(R.id.card_front_text2); 
     imageView = (ImageView) itemView.findViewById(R.id.card_front_imageview); 
     relativeLayout = (RelativeLayout) itemView.findViewById(R.id.card_front_relativelayout); 
     cardView = (CardView) itemView.findViewById(R.id.cardView); 
    } 
} 

}を拡張し

XML:

股関節の親のレイアウトがCardviewあり、相対レイアウトの子があります。

答えて

1

RecyclerViewは、ビューを再利用してデータを入力します。クリックしたビューの位置を保存する必要があります。

myViewHolder.cardView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     clickedPosition = position; 
     ...... 
    } 
}); 

そしてonBindViewHolderには、これらたstatmentsを追加します:

if (position == clickedPosition) { 
    resources = context.getResources(); 
    drawable = resources.getDrawable(data.get(position).imageId); 
    myViewHolder.relativeLayout.setBackground(drawable); 
} else { 
    myViewHolder.relativeLayout.setBackground(/* default background*/); 
} 
OnClickListenerで位置を保存
1

アイテムビューはRecyclerViewによって再利用されるため、 onBindViewHolderメソッドでは、アイテムビューを適切な状態に設定する必要があります。

関連する問題