I'm trying to pass the level data from a fragment to a recyclerview adapter. I store that variable inside a global variable and it is the correct value when checked within constructor. But, when I try to use it insdie onBindViewHolder, the value becomes 0. How can I get the correct value that is passed inside the constructor and use it inside onBindViewHolder?
HabitsAdapter.java
public class HabitsAdapter extends RecyclerView.Adapter<HabitsAdapter.ViewHolder> {
private List<HabitModel> mHabitList;
private Activity mActivity;
private DataBaseHandler db;
private int mLevel;
private UserModel mUser = new UserModel();
public HabitsAdapter(DataBaseHandler db, Activity activity, int level){
this.db = db;
this.mActivity = activity;
this.mLevel = level;
Log.d("HabitsAdapter", "Level in constructor: " + mLevel);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
UserModel mUser = new UserModel();
HabitModel item = mHabitList.get(position);
holder.mTitle.setText(item.getHabit() + " " + item.getPreposition() + " " + item.getCue());
holder.mDescription.setText(item.getDescription());
int pos = holder.getAdapterPosition();
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
editHabit(pos);
}
});
holder.mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("HabitsAdapter", "Level in onBindViewHolder: " + mLevel);
int coin = mUser.getCoin() + 5;
mUser.setCoin(coin);
Bundle args = new Bundle();
args.putInt("coin", coin);
FragmentActivity activity = (FragmentActivity)(getContext());
FragmentManager fm = activity.getSupportFragmentManager();
StatsFragment fragment = new StatsFragment();
fragment.setArguments(args);
fm.beginTransaction()
.replace(R.id.stats_container, fragment, StatsFragment.TAG)
.commit();
Log.d("app", "Final coin: " + mUser.getCoin());
}
});
}
StatsFragment.java
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
db = new DataBaseHandler(getActivity());
db.openDatabase();
mUser = db.getUser();
mHabitsAdapter = new HabitsAdapter(db, getActivity(), mUser.getLevel());
}
DatabaseHandler.java:
public UserModel getUser(){
UserModel user = new UserModel();
Cursor cursor = null;
db.beginTransaction();
try {
cursor = db.query(TABLE_NAME1, null, null, null, null, null, null, null);
if(cursor != null){
if(cursor.moveToFirst()){
user.setCoin(cursor.getInt(cursor.getColumnIndexOrThrow(COINS)));
user.setRate(cursor.getInt(cursor.getColumnIndexOrThrow(COIN_RATE)));
user.setExperience(cursor.getInt(cursor.getColumnIndexOrThrow(EXPERIENCE)));
user.setLevel(cursor.getInt(cursor.getColumnIndexOrThrow(LEVEL)));
}
}
}finally{
db.endTransaction();
assert cursor != null;
cursor.close();
}
return user;
}
StatsFragment.java:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mCoinTxt = view.findViewById(R.id.coinText);
mRateTxt = view.findViewById(R.id.rateText);
mLevelTxt = view.findViewById(R.id.levelText);
db = new DataBaseHandler(getActivity());
db.openDatabase();
mUser = db.getUser();
//Setting initial text in fragment (when reload)
mHabitsAdapter = new HabitsAdapter(db, getActivity(), mUser.getLevel());
mHabitsAdapter.setUser(mUser);
mCoinTxt.setText(String.valueOf(mUser.getCoin()));
mLevelTxt.setText(String.valueOf(mUser.getLevel()));
final Bundle bundle = getArguments();
if (bundle != null) {
int coin = bundle.getInt("coin");
mCoinTxt.setText(String.valueOf(coin));
mUser.setCoin(coin);
int level = bundle.getInt("level");
mLevelTxt.setText(String.valueOf(level));
mUser.setLevel(level);
}else{
Log.d("statsfrag", "No bundle");
}
if(bundle!=null) {
int coin = Integer.valueOf(mCoinTxt.getText().toString());
int level = Integer.valueOf(mLevelTxt.getText().toString());
db.updateStats(1, coin, 0, 0, level);
}
Logcat:
D/HabitsAdapter: Level in constructor: 3
D/HabitsAdapter: Level in onBindViewHolder: 0