创建对象的ArrayList会导致每个元素都相同

时间:2016-04-08 17:20:02

标签: java android arraylist

我是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();
        }
    }

}

来自Items.java: -

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

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

但是当我运行它时,我发现ArrayList(和ListView)中的所有项都与从文件中读取的最后一项相同。我试过调试这个,发现ArrayList中的所有项都改为行后添加的最后一项: -

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

请有人解释为什么会这样以及如何解决这个问题?

我之前在此网站上检查过Creating an ArrayList of Objects,发现我的ArrayList种群方法与建议的相同。

3 个答案:

答案 0 :(得分:-1)

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

答案 1 :(得分:-1)

static类中的字段使用Item会导致它们属于该类,而不属于该类的实例。 每次创建新项目时,都要将类字段重置为新值。您的Item个对象没有声明任何特定于实例的数据。

答案 2 :(得分:-1)

在您的Item类中,可以看到变量属于 static 类型,这可能是一个可能的原因。尝试删除静态关键字,如在这种情况下,这些变量/属性值依赖于对象而不是所有对象的通用

mainApp.controller('mainController', function($scope, pageBean) {
    $scope.title = '';
    $scope.card = {
        number: '',
        epic: '',
        name: '',
        points: 1
    };
    $scope.cardList = [];
    $scope.addCard = function(){
        $scope.cardList.unshift($scope.card);
        pageBean.setCardList(cardList);
        $scope.card.number = '';
        $scope.card.epic = '';
        $scope.card.name = '';
        $scope.card.points = 1;
        console.log($scope.cardList);
    };

    $scope.delete = function(card){
        var index = $scope.cardList.indexOf(card);
        $scope.cardList.splice(index, 1);
        console.log($scope.cardList);
    };

    $scope.finish = function(){
        window.location.href = "#cardPrint";
    };

    $scope.test = function(){
        console.log($scope.cardList);
    };
});

希望这能解决你的问题..