Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建对象的ArrayList会使每个元素都相同_Java_Android_Arraylist - Fatal编程技术网

Java 创建对象的ArrayList会使每个元素都相同

Java 创建对象的ArrayList会使每个元素都相同,java,android,arraylist,Java,Android,Arraylist,我不熟悉Java和Android。我正在编写的应用程序的一部分从文件中读取项目数据,并在使用它填充ListView之前填充项目的ArrayList 从main.java:- public class MainActivity extends AppCompatActivity { public static ArrayList<Item> items; . . . private void ReadItemsFile() throws IOEx

我不熟悉Java和Android。我正在编写的应用程序的一部分从文件中读取项目数据,并在使用它填充ListView之前填充项目的ArrayList

从main.java:-

public class MainActivity extends AppCompatActivity {
    public static ArrayList<Item> items;
    .
    .
    .
    private void ReadItemsFile() throws IOException {

        File itemsFile = new File(itemsFilenameString);
        items = new ArrayList<Item>();

        try (BufferedReader itemsBufferedReader = new BufferedReader(new FileReader(itemsFile))) {
            for (String line; (line = itemsBufferedReader.readLine()) != null; ) {
                String[] lineStrings = line.split("\t|\n", 2);
                int itemNo = Integer.parseInt(lineStrings[0]);

                items.add(new Item(itemNo, lineStrings[1]));

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
但是当我运行这个程序时,我发现ArrayList(和ListView)中充满了与上次从文件中读取的项目相同的项目。我已尝试对此进行调试,发现ArrayList中的所有项都已更改为在该行之后添加的最后一项:-

items.add(new Item(itemNo, lineStrings[1]));
请有人解释一下为什么会这样,以及如何修复它


我以前在这个网站上检查过,发现我的ArrayList填充方法与建议的方法相同。

我以前遇到过这个问题。当时我无法找到解决方案,所以我最终采用了另一种方法,即使用SQLite数据库将有关我的项目的信息存储在本地存储中。我不确定这对您是否有帮助,但它是将数据存储在常规文件中的一种可行的替代方法。

类中的字段使用
静态
,会使它们属于该类,而不是该类的实例。
每次创建新项时,都会将类字段重置为新值。您的
对象没有任何特定于实例的数据删除。

在您的项类中,可以看到类型为静态的变量,这可能是一个原因。尝试删除static关键字,因为在此场景中,这些变量/属性值依赖于对象,而不是所有对象的公共值

public class Item {
    private int idInt;
    private String description;
    private Image image;

    public Item(int idInt, String description,Image image) {
         this.idInt = idInt;
         this.description = description;
         this.image = image;
    }

希望这能解决您的问题。

这与他们的存储无关。他们的
类中显然有
静态
变量,而不是实例变量。谢谢。我确实考虑过这条路线,但现在我意识到这是多余的。非常感谢。这解决了问题。非常感谢。这就解决了问题。
public class Item {
    private int idInt;
    private String description;
    private Image image;

    public Item(int idInt, String description,Image image) {
         this.idInt = idInt;
         this.description = description;
         this.image = image;
    }