You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView仅显示ArrayList最后一项且重复显示问题求助

问题描述

手动创建对象时RecyclerView原本正常,改为从SQLite取数据后出现异常,恢复手动创建也无法正常运行。控制台显示每个列表位置获取的都是最后一个item的username「Hello」,界面重复显示该内容。


RecyclerView适配器代码

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类代码

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; }
}

Activity代码

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);

控制台输出

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

界面效果

所有列表项重复显示Hello


解决方案

问题核心是myUser类的成员变量及对应getter方法错误使用了static修饰符:

  • static修饰的变量属于类级共享变量,所有myUser实例共用同一组值。创建第三个实例user3时,它的username会覆盖前两个实例的对应值,导致所有实例调用getUsername()都返回最后设置的「Hello」。

修改myUser类,去掉所有成员变量的static修饰符,并将static getter改为普通实例方法:

public class myUser {

    private int id;
    private String username;
    private String nationality;
    private String role;
    private boolean teamStatus;
    private int teamID;
    private 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 String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

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

    public 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 int getTeamID() { return teamID; }
    public void setTeamID(int teamID) { this.teamID = teamID; }

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

修改后每个myUser实例将拥有独立的成员变量值,RecyclerView即可正常显示不同条目的内容。

内容的提问来源于stack exchange,提问作者GMac06

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:50:02