Search code examples
androidandroid-arrayadapterandroid-adapter

Android - ArrayAdapter mixed positions?


TL;DR - I have an array adapter, filled by an ArrayList of User object, and I want to print their order numbers - 1st, 2nd, 3rd... etc - while scrolling fast back and forth.. those numbers get mixed..

instead of 1,2,3,4 after scrolling fast back and forth I get 1,2,9,4 for example..

I don't get why this happens, I've tried several stuff to solve it but with no success, I even took that text view out of the view holder to see if it helps but no success there too.

here's my adapter:

public class HomeHallOfFameAdapter extends ArrayAdapter<User> {

private HomeFragment fragment;
private ArrayList<User> data;
int page;

public HomeHallOfFameAdapter(Context context, ArrayList<User> data, HomeFragment fragment, int page) {
    super(context, 0);
    this.data = data;
    this.fragment = fragment;
    this.page = page;
}

@Override
public int getCount() {
    return data != null ? data.size() : 0;
}

@Override
public User getItem(final int position) {
    return data.get(position);
}

@Override
public long getItemId(final int position) {
    //only used for adapters connected to a cursor.
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    MyHolder holder = null;

    final User user = data.get(position);

    //initiallize the views
    if (convertView == null) {

        convertView = LayoutInflater.from(getContext()).inflate(R.layout.home_frag_hall_of_fame_item, null);
        holder = new MyHolder();

        holder.profileImage1 = (ImageView) convertView.findViewById(R.id.home_hallofame_image);

        convertView.setTag(holder);

    } else {
        holder = (MyHolder) convertView.getTag();
    }

    final TextView titleRank = (TextView) convertView.findViewById(R.id.home_hallofame_title);
    final String numberEnding = MainScreenActivity.getInstance().NumberWithSuffix(position+1);
    titleRank.setText(numberEnding);

    loadImage(user.getImages().get(0), holder.profileImage1);

    return convertView;
    //return super.getView(position, convertView, parent);
}

private class MyHolder {
    //TextView titleRank;
    ImageView profileImage1; //fameBlueBtn;
}

}

the problem is the titleRank textView..

NumberWithSuffix is just a method that implements the number ending:

//method to get the currect number endings.
public String NumberWithSuffix(int number) {

    String outputNumber = "";
    String numberString = String.valueOf(number);

    if (String.valueOf(number).endsWith("11")) {
        outputNumber = numberString + "th";
    } else if (String.valueOf(number).endsWith("12")) {
        outputNumber = numberString + "th";
    } else if (String.valueOf(number).endsWith("13")) {
        outputNumber = numberString + "th";
    } else if (String.valueOf(number).endsWith("1")) {
        outputNumber = numberString + "st";
    } else if (String.valueOf(number).endsWith("2")) {
        outputNumber = numberString + "nd";
    } else if (String.valueOf(number).endsWith("3")) {
        outputNumber = numberString + "rd";
    } else {
        outputNumber = numberString + "th";
    }
    return outputNumber.trim();
}

any idea what's my problem?

thanks for any help.


Solution

  • So.. I've solved this issue.. my code was ok, as I mentioned, it works fine in a vertical list view, but this problem happens in a horizontal list view.. I removed the list view github library i was using and switched to Horizontal Recycler View.. it works great now !