Reputation: 758
I want to use one of the buttons in of my Recyclerviews to change one Object in the Recyclerview, namely speaking setting an Imageview to transparent.
So I found out that I need to use notifyItemChanged(int,object,payload) for that occasion see this thread: (Example NotifyItemChanged). Sadly this example does not reach that for on how to use the Object Value to change the Value of a Image, (ImageView.setImageAlpha(70)).
Request:
Can you please give me an example on how to change the setImageAlpha value of one of a ImageView in a Recycleradapter using notifyItemChanged.
My Framework
I will post my Code so if you want you can edit it accordingly. But I can try to do it by myself too.
public class deckbuilder_RViewAdapter_Card extends RecyclerView.Adapter<deckbuilder_RViewAdapter_Card.ViewHolder > {
private List<Cards> mData;
private List<Heros> mHero, mHeroAdd;
private List<Spells> mSpell, mSpellSig;
private List<Items> mItem;
private List<Improvements> mImpr, mImprSig;
private List<Creeps> mCreep, mCreepSig;
private List<Decklist> mDecklist;
private List<Decklist_Heros> mDecklistHeros;
DBHelper dbHelper;
private CardView introCardview;
private Context mContext;
private RecyclerView mrvList,mrvHeros;
private deckbuilder_RViewAdapter_List mRViewAdapterList;
private deckbuilder_RViewAdapter_Heros mRViewAdapterHeros;
private int questionmarkNo;
public deckbuilder_RViewAdapter_Card (FragmentActivity mContext, List<Cards> mData, deckbuilder_RViewAdapter_List mRViewAdapterList, List<Decklist> mDecklist, RecyclerView rvList, deckbuilder_RViewAdapter_Heros mRViewAdapterHeros, List<Decklist_Heros> mDecklistHeros, RecyclerView rvHeros) {
this.mData = mData;
this.mContext = mContext;
this.mRViewAdapterList = mRViewAdapterList;
this.mDecklist = mDecklist;
this.mrvList = rvList;
this.mRViewAdapterHeros = mRViewAdapterHeros;
this.mDecklistHeros = mDecklistHeros;
this.mrvHeros= rvHeros;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
dbHelper = new DBHelper(mContext.getApplicationContext());
dbHelper.createDataBase();// used for clickable
//Todo change inflated layout later on <-????
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_cardview_deckbuilder_cards, viewGroup, false);
return new deckbuilder_RViewAdapter_Card.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
viewHolder.ivCardImage.setImageResource(mData.get(position).getCardImage());
viewHolder.tvCardName.setText(mData.get(position).getCardName());
viewHolder.ivCardImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cardClickable(position);
}
});
viewHolder.tvCardName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cardClickable(position);
}
});
/* Init the Add and Remove button */
viewHolder.civ_deckbuilder_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mData.get(position).getCardType().equals("hero")){
addHero(viewHolder, position);
}else {
addOtherCards(viewHolder,position);
}
}
});
viewHolder.civ_deckbuilder_remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mData.get(position).getCardType().equals("hero")){
removeHero(position);
**viewHolder.ivCardImage.setImageAlpha(70);**
}else {
removeOtherCard(position);
**viewHolder.ivCardImage.setImageAlpha(70);**
}
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
CircleImageView civ_deckbuilder_add, civ_deckbuilder_remove, civ_deckbuilder_number;
ImageView ivCardImage;
TextView tvCardName;
public ViewHolder(@NonNull View introListView) {
super(introListView);
ivCardImage = introListView.findViewById(R.id.ivDeckbuilder_img);
tvCardName = introListView.findViewById(R.id.tvDeckbuilder_title);
civ_deckbuilder_add = introListView.findViewById(R.id.civ_deckbuilder_add);
civ_deckbuilder_remove = introListView.findViewById(R.id.civ_deckbuilder_remove);
}
}
//[...] used methods should not be relevant.
}
Thanks for any help you might offer me!
Upvotes: 0
Views: 144
Reputation: 134
First of all your Cards data class should have an alpha property initialize with value 255 for a fully visible image.
In onBindViewHolder use
viewHolder.ivCardImage.setImageAlpha(mData.get(position).getAlpha());
Then in your click event
@Override
public void onClick(View view) {
....
mData.get(position).setAlpha(70);
notifyItemChanged(position);
}
}
Upvotes: 1
Reputation: 319
Does your button live outside the RecyclerView?
Assuming it does, expose a method in your adapter that takes in a positional value and the value you want to change to. You also will need a method to modify whatever item you want in the ViewHolder.
Something like this should work...
In your adapter:
public void updateItem(int position, Object object) {
mData.set(object, position);
notifyItemChanged(position);
}
In your viewHolder:
public void modifyAlpha(int alpha) {
imageView.setAlpha(alpha);
}
In your clickListener for the action:
public void onRecyclerClick(int position, Object object) {
ViewHolder h = recyclerView.findViewHolderForAdapterPosition(adapterPosition);
h.modifyAlpha(alpha);
recyclerView.notifyUpdate(position, object);
}
Hope this helps!
Upvotes: 1