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
界面效果

解决方案
问题核心是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
相关产品推荐
相关产品推荐

