私は食品のリストからrecyclerviewを持っています。アイテムをクリックすると、アイテムがグレー表示されます。今これはうまくいき、私が押す最初の項目は、実際には灰色に変わります。しかし、もう一度押すと、他のセルがグレーに変わります。それからそれは大きな混乱に変わり、ランダムなものがグレーになる。RecyclerView onBindViewHolderクリックリスナーが間違ったセルの内容を変更します
アイテムをクリックすると、FoodItemインスタンスにブール値が設定されていることを設定しました。次に、recyclerviewのデータをリフレッシュして、ブール値を設定したアイテムに灰色のオーバーレイが表示されるようにします。ここで
は私のアダプタです:[
public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.MyViewHolder> {
ClickListener clickListener;
private List<FoodItem> foodList;
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public interface ClickListener {
void ItemClicked(View v, int position);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public TextView quantity;
public RelativeLayout background;
public LinearLayout eatenOverlay;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.textView_item_name);
quantity = (TextView) view.findViewById(R.id.textView_item_quantity);
background = (RelativeLayout) view.findViewById(R.id.food_item_background_relative_layout);
eatenOverlay = (LinearLayout) view.findViewById(R.id.eaten_overlay);
}
}
public FoodAdapter(List<FoodItem> foodList) {
this.foodList = foodList;
}
@Override
public FoodAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item_list, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(FoodAdapter.MyViewHolder holder, final int position) {
FoodItem currentFoodItem = foodList.get(position);
if(currentFoodItem.isHasBeenEaten()){
holder.eatenOverlay.setVisibility(View.VISIBLE);
}
Resources res = holder.itemView.getContext().getResources();
holder.name.setText(currentFoodItem.getName());
holder.quantity.setText(currentFoodItem.getQuantity());
holder.background.setBackgroundResource(currentFoodItem.getImage());
holder.background.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.ItemClicked(v, position);
}
}
});
}
@Override
public int getItemCount() {
return foodList.size();
}
}
そして、主な活動は、インターフェイスを実装し、その項目をクリックすると、メインacitivtyに、私はこのコードを持っています。
@Override
public void ItemClicked(View v, int position) {
foodList.get(position).setHasBeenEaten(true);
Log.d(TAG,foodList.get(position).getName() + " clicked");
Log.d(TAG,"position: " + position);
mAdapter.notifyDataSetChanged();
}
どうしてですか?ありがとう
ViewHolderクラスのonclickリスナーを実装し、getAdapterPosiotion()から位置を取得する必要があります。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition() –