Search code examples
javaandroidarraylistandroid-recyclerview

RecyclerView only displaying last item from ArrayList, showing same amount of times as there are items in the list


I don't really understand what is going wrong, I have been trying to figure it out for quite some time. I would usually avoid making a post about it but I can't seem to find any relating problem on Google, no matter what I search. I cannot find even one person that has experienced this problem.

When I first made the RecyclerView and adapter, they worked fine (implementing each object manually like shown below). I didn't really change anything but when I tried to change to program it to return an ArrayList (from SQLite database) and pass that ArrayList into the adapter, it stopped working. So going back to manually creating objects and the ArrayList, it still does not work?

Any help would be much, much appreciated :)

My RecyclerView adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{

    Context context;
    ArrayList<myUser> listings;

    public RecyclerViewAdapter(Context context, ArrayList<myUser> arrayList) {
        this.context = context;
        this.listings = arrayList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.recyclerview_row, parent, false);
        return new MyViewHolder(view);
    }


    /**
     * This basically controls the customisation of each item in the RecyclerView
     * @param holder The ViewHolder which should be updated to represent the contents of the
     *        item at the given position in the data set.
     * @param position The position of the item within the adapter's data set.
     */
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        System.out.println(position);
        myUser item = listings.get(position);

        holder.teamName.setText(item.getUsername());
        System.out.println(item.getUsername());
        //holder.teamLevel.setText(item.getTeamLevel());
        //holder.requiredRole.setText(item.getRoleRequired());
    }

    /**
     * This gets the length of your dataset to determine how many items will be in the RecyclerView
     * So the length of the ArrayList in this case.
     * @return
     */
    @Override
    public int getItemCount() {
        return listings.size();
    }


    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView teamName, teamLevel, requiredRole;
        Button btnApply;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            teamName = itemView.findViewById(R.id.tvTeamName);
            teamLevel = itemView.findViewById(R.id.tvTeamLevel);
            requiredRole = itemView.findViewById(R.id.tvRoleRequired);
        }
    }
}

myUser class:

public class myUser {

    private static int id;
    private static String username;
    private static String nationality;
    private static String role;
    private static boolean teamStatus;
    private static int teamID;
    private static String teamName;

    public myUser(int id, String username, @Nullable String nationality, @Nullable String role, @Nullable int teamID, @Nullable String teamName) {
        this.id = id;
        this.username = username;
        this.nationality = nationality;
        this.role = role;
        this.teamID = teamID;
        this.teamName = teamName;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public static String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public static String getNationality() {
        return nationality;
    }
    public void setNationality(String nationality) {
        this.nationality = nationality;
    }

    public static String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }

    public boolean isTeamStatus() {
        return teamStatus;
    }
    public void setTeamStatus(boolean teamStatus) {
        this.teamStatus = teamStatus;
    }

    public static int getTeamID() { return teamID; }
    public static void setTeamID(int teamID) { myUser.teamID = teamID; }

    public static String getTeamName() { return teamName; }
    public static void setTeamName(String teamName) { myUser.teamName = teamName; }
}

The activity code:

myUser user1 = new myUser(12, "Sid", null, null, -1, null);
myUser user2 = new myUser(13, "George", null, null, -1, null);
myUser user3 = new myUser(14, "Hello", null, null, -1, null);

ArrayList<myUser> newArray = new ArrayList<>();
newArray.add(user1);
newArray.add(user2);
newArray.add(user3);

/* Recycler View */
RecyclerView rv = findViewById(R.id.recyclerView_teamFind);
rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, newArray);
rv.setAdapter(adapter);

The console output (from System.out.println statements within onBindViewHolder):

I/System.out: 0
I/System.out: Hello
I/System.out: 1
I/System.out: Hello
I/System.out: 2
I/System.out: Hello

And the final result:

The final result of the code

I just have absolutely no clue what is wrong, it was working. Now it isn't.


Solution

  • As per your code of myUser class , It is clearly visible that issue is with static as you have declared each variable static . I don't know why you did it as you have getter and setter methods and that is the suggested way to do it . So just remove static keyword from variables as it is making single copy in memory and updating each object variable value .