我是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种群方法与建议的相同。
答案 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);
};
});
希望这能解决你的问题..