Global variable changed in onBindViewHolder

Viewed 24

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
1 Answers

Okay I found out the solution. Basically, I need to make my mLevel variable inside my UserModel class as static. Because in onBindViewHolder, each item is creating their own level variable which makes it return 0.

Related