我有一个在onCreate方法中创建的listView。如下所示,并从存储过程中读取数据。 我使用了CallabeStatement。
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.type_of_dairy);
try
{
CallableStatement catCallable;
ConnectionHelper connectionHelper = new ConnectionHelper();
catCallable = connectionHelper.getConnection().prepareCall("{ CALL SpGetDairyCategory}");
catCallable.execute();
resultSet = catCallable.getResultSet();
setResultSet(resultSet);
if(getResultSet().next()) {
do {
String typeString = resultSet.getString("CategoryName");
int typeId = resultSet.getInt("CategoryId");
integerArraList.add(typeId);
typeArray.add(typeString);
typeAdapter.getItemViewType(R.id.listView); // adapter for first ListView
dairyType.setAdapter(typeAdapter);//dairyType is my first List View
}while(resultSet.next());
}
}
catch (SQLException e)
{
Toast.makeText(getApplicationContext(), "Something is wrong", Toast.LENGTH_LONG).show();
}
在上面的代码中,我获得了Category Id和name的Id,并将它们传递给两个名为integerArrayList和typeArray的ArrayLists。
我生成了第二个ListView,其中包含我从上面的存储过程中获得的类别ID。 我在dairyType(第一个ListView)onClickListener中执行此操作。 这是代码
dairyType.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
flavorAapter.clear();
CallableStatement proCallable;
ConnectionHelper connectionHelper = new ConnectionHelper();
proCallable = connectionHelper.getConnection().prepareCall("{call SpGetCategoryProducts(?)}");
proCallable.setInt(1, integerArraList.get(dairyType.getCheckedItemPosition())); //integerArrayList contains the categoryId from the first Store Procedure
resultSet2 = proCallable.executeQuery();
//The second Stored Procedure get the Id and return some value as you see
if (resultSet2.next()) {
do {
int flavourId;
int weitgh;
int price;
weitgh = resultSet2.getInt("Weight");
price = resultSet2.getInt("Price");
String flavourString = resultSet2.getString("Name");
flavourId = resultSet2.getInt("Id");
dairyArray.add(flavourString);
idOfCategories.add(flavourId);
weightArray.add(weitgh);
priceArray.add(price);
flavorAapter.getItemViewType(R.id.listView2);
dairyFlavour.destroyDrawingCache();
dairyFlavour.setAdapter(flavorAapter);
} while (resultSet2.next());
connectionHelper.closeConnection();
} else {
flavorAapter.clear();
Toast.makeText(getApplicationContext(), "Nothing to show", Toast.LENGTH_LONG).show();
}
} catch (SQLException e) {
Toast.makeText(getApplicationContext(), "Something wrong", Toast.LENGTH_LONG).show();
dairyArray.clear();
}
}
});
好的,所以我按照自己的意愿成功生成了第二个Listview, 问题出在插入Buttom, 现在我有名称,重量,价格和Id的ArrayList。(我使用Id作为传递给最后存储过程的参数。 所以我必须调用另一个存储过程将所有这些数据插入DB(名称,重量,价格) 但它不会插入更改的项值。 这意味着,我从第一个ListView中选择一个项目,第二个Listview生成,我选择其中一个,但是当我在第一个ListView中更改我的选择时,它仍然插入第一个ListView的id。 这是我的插入代码,通过buttom命名为apply。
apply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
dairyFlavour.invalidateViews();
dairyType.invalidateViews();
typeAdapter.notifyDataSetInvalidated();
flavorAapter.notifyDataSetChanged();
int weight = weightArray.get(dairyFlavour.getCheckedItemPosition()); //weitgh from previous SP
int price = priceArray.get(dairyFlavour.getCheckedItemPosition()); //price from previous SP
String count = "";
int c;
count = countOfProduct.getText().toString(); // insert the count of product via editText
c = Integer.parseInt(count); // cast the cound to Integer
we = idOfCategories.get(dairyFlavour.getCheckedItemPosition());//the id i got in previous SP
CallableStatement callableStatement = null;
ConnectionHelper connectionHelper = new ConnectionHelper();
callableStatement = connectionHelper.getConnection().prepareCall("{call SpInsertLoadCityProducts(?, ?, ? ,?)}");
callableStatement.setInt(1, we);
callableStatement.setInt(2, weight);
callableStatement.setInt(3, price);
callableStatement.setInt(4, c);
callableStatement.executeQuery();
}catch(SQLException e){
Toast.makeText(getApplicationContext(), "Something is wrong", Toast.LENGTH_LONG).show()
}
Intent i = new Intent(getApplicationContext(), FinishLoading.class);
startActivity(i);
}
});
在视图中它是可以的,因为我根据需要更改了第一个ListView生成的第二个ListView。 但是在insert中,我只将第一个选择的值插入到DB中,当我在第一个ListView中更改选择并在第二个ListView中选择另一个产品并单击apply buttom时,将插入第一个数据。
有什么建议吗? 如果你感到困惑,请提出问题,让自己更清楚!
答案 0 :(得分:0)
我找到了解决方案。 我应该清除每个ArrayList存储数据。 当第一次获取索引和数据时,我应该清除ArrayList并再次填写它们,如下所示。
dairyTypes.clear();
integerArraList.clear();
typeArray.clear();
以及
flavorAapter.clear();