私はちょうどプロジェクトのために特にアンドロイドプログラミングを学び始めました。そして、これはそうすべきではありませんが、非常に基本的なことに固執しました。問題はSql
データベースを使用してAndroid ListView
の製品詳細を表示しています。これはうまくいきます。もう一度ボタンをクリックして商品データを追加します。製品を追加すると、ListView
が繰り返されます。沿って、新たに追加された製品と同じように、以前の製品の詳細は以下の画像のようにListView
に二回繰り返しますを示しています。データがAndroidで繰り返されるリストビュー
注:画像で、ノキア(NokiaのLumia)は、新たに入力された製品です。 で
はボタンを追加し、私は次のようにListView
をリフレッシュするためにShowProducts
メソッドを呼び出しました:
if(isSuccess == true) {
ShowProducts showProducts = new ShowProducts();
showProducts.execute();
}
私はそれが起こっている理由はわかりません。デバッグはできますが、それを把握することはできません。 SimpleAdapterのnotifyDataSetChanged
メソッドをリフレッシュするために使用しましたが、機能しませんでした。ここでは、テーブルの構造である:
Products.java:プロジェクトフォルダに
CREATE TABLE [dbo].[Products](
[ProductId] [int] IDENTITY(1,1) PRIMARY KEY,
[ProductName] [nvarchar](60) NOT NULL,
[Code] [nvarchar](60) NOT NULL,
[Code] [nvarchar](60) NOT NULL,
[Date] [datetime] NOT NULL
)
、アプリ\ SRC \メイン\のJava \のcom.example.at.projectnameフォルダ、いくつかのクラスを作成しました:
public class Products {
private String code;
private String name;
private String price;
public String getCode(String productCode) {
code = productCode;
return code;
}
public String getName(String productName) {
name = productName;
return name;
}
public String getPrice(String productPrice) {
price = productPrice;
return price;
}
}
ConnectionClass.java:
public class ConnectionClass {
String ip = "";
String classs = "net.sourceforge.jtds.jdbc.Driver";
String db = "sampleDB";
@SuppressLint("NewApi")
public Connection CONN() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
Connection conn = null;
String ConnURL = null;
try {
Class.forName(classs);
ConnURL = "jdbc:jtds:sqlserver://" + ip + ";"
+ "databaseName=" + db + ";user=" + ";password="
+ ";";
conn = DriverManager.getConnection(ConnURL);
} catch (SQLException se) {
Log.e("Error: ", se.getMessage());
} catch (ClassNotFoundException e) {
Log.e("Error: ", e.getMessage());
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return conn;
}
}
ProductActivity.java:
public class ProductActivity extends Activity {
ConnectionClass connectionClass;
EditText edtpProductName, edtProductCode, edtProductPrice;
Button btnAdd, btnUpdate, btnDelete;
ProgressBar pbbar;
ListView lstProduct;
String productCode;
List<Map<String, String>> productList = new ArrayList<Map<String, String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.products);
connectionClass = new ConnectionClass();
edtpProductName = (EditText) findViewById(R.id.edtProductName);
edtProductCode = (EditText) findViewById(R.id.edtProductCode);
edtProductPrice = (EditText) findViewById(R.id.edtProductPrice);
btnAdd = (Button) findViewById(R.id.btnAdd);
btnUpdate = (Button) findViewById(R.id.btnUpdate);
btnDelete = (Button) findViewById(R.id.btnDelete);
pbbar = (ProgressBar) findViewById(R.id.pbbar);
pbbar.setVisibility(View.GONE);
lstProduct = (ListView) findViewById(R.id.lstProducts);
productCode = "";
lstProduct.addHeaderView(getLayoutInflater().inflate(R.layout.header, null, false));
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddProducts addProducts = new AddProducts();
addProducts.execute();
}
});
ShowProducts showProducts = new ShowProducts();
showProducts.execute();
}
public class ShowProducts extends AsyncTask<String, String, String> {
String msg = "";
@Override
protected void onPreExecute() {
pbbar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(String r) {
pbbar.setVisibility(View.GONE);
Toast.makeText(ProductActivity.this, r, Toast.LENGTH_SHORT).show();
final Products products = new Products();
String[] from = { products.getCode("Code"), products.getName("ProductName"), products.getPrice("Price") };
int[] views = {R.id.lblProductCode, R.id.lblProductName, R.id.lblProductPrice};
final SimpleAdapter ADA = new SimpleAdapter(ProductActivity.this, productList, R.layout.lsttemplate, from, views);
lstProduct.setAdapter(ADA);
ADA.notifyDataSetChanged();
lstProduct.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
HashMap<String, Object> obj = (HashMap<String, Object>) ADA
.getItem(arg2);
productCode = (String) obj.get(products.getCode("Code"));
String productName = (String) obj.get(products.getName("ProductName"));
String productPrice = (String) obj.get(products.getPrice("Price"));
edtProductCode.setText(productCode);
edtpProductName.setText(productName);
}
});
}
@Override
protected String doInBackground(String... params) {
try {
Connection con = connectionClass.CONN();
if (con == null) {
msg = "Error in connection with SQL server";
} else {
String query = "SELECT ProductName, Code, Price FROM Products";
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Products products = new Products();
Map<String, String> productList = new HashMap<String, String>();
String code = products.getCode(rs.getString("Code"));
String name = products.getName(rs.getString("ProductName"));
String price = products.getName(rs.getString("Price"));
productList.put("Code", code);
productList.put("ProductName", name);
productList.put("Price", price);
ProductActivity.this.productList.add(productList);
}
msg = "Success";
}
} catch (Exception ex) {
msg = "Error retrieving data from table";
}
return msg;
}
}
public class AddProducts extends AsyncTask<String, String, String> {
String msg = "";
Boolean isSuccess = false;
String proname = edtpProductName.getText().toString();
String procode = edtProductCode.getText().toString();
String proprice = edtProductPrice.getText().toString();
@Override
protected void onPreExecute() {
pbbar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(String r) {
pbbar.setVisibility(View.GONE);
Toast.makeText(ProductActivity.this, r, Toast.LENGTH_SHORT).show();
if(isSuccess == true) {
ShowProducts showProducts = new ShowProducts();
showProducts.execute();
}
}
@Override
protected String doInBackground(String... params) {
if (proname.trim().equals("")) {
msg = "Please enter product name!";
} else if (procode.trim().equals("")) {
msg = "Please enter product code!";
} else if (proprice.trim().equals("")) {
msg = "Please enter product price!";
} else {
try {
Connection con = connectionClass.CONN();
if (con == null) {
msg = "Error in connection with SQL server";
} else {
String dates = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).format(Calendar.getInstance().getTime());
String query = "INSERT INTO Products (ProductName, Code, Price, Date) VALUES ('" + proname + "', '" + procode + "', '" + proprice + "', '" + dates + "')";
PreparedStatement ps = con.prepareStatement(query);
ps.executeUpdate();
msg = "Added Successfully";
isSuccess = true;
}
} catch (Exception ex) {
isSuccess = false;
msg = "Exceptions";
}
}
return msg;
}
}
}
は、最後にレイアウトをしています。 2つのレイアウトがあります。 I)のproducts.xml - 主レイアウトII)lsttemplate.xml - ListView
の修飾のための:
あるproducts.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#282828"
android:padding="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:padding="2dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name_addproducts"
android:layout_marginTop="7dp"
android:typeface="sans"
android:textSize="35sp"
android:textColor="#ffffff"
android:gravity="center" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="#ffffff"
android:textColorHint="#ffffff"
android:textStyle="bold"
android:background="#5d5d5d"
android:padding="10dp"
android:hint="@string/app_name_addproductName"
android:textSize="20sp"
android:id="@+id/edtProductName" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:hint="@string/app_name_addproductCode"
android:textColor="#ffffff"
android:textColorHint="#ffffff"
android:textStyle="bold"
android:background="#5d5d5d"
android:padding="10dp"
android:inputType="textMultiLine"
android:maxLines="3"
android:minLines="2"
android:layout_gravity="top|left"
android:layout_marginTop="5dp"
android:id="@+id/edtProductCode" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:hint="@string/app_name_addproductPrice"
android:textColor="#ffffff"
android:textColorHint="#ffffff"
android:textStyle="bold"
android:background="#5d5d5d"
android:padding="10dp"
android:inputType="textMultiLine"
android:maxLines="3"
android:minLines="2"
android:layout_gravity="top|left"
android:layout_marginTop="5dp"
android:id="@+id/edtProductPrice" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="3"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorDarkForest"
android:layout_weight="1"
android:textColor="#ffffff"
android:textSize="20sp"
android:layout_margin="2dp"
android:padding="7dp"
android:layout_marginTop="10dp"
android:id="@+id/btnAdd"
android:text="@string/app_name_addproduct" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorDarkForest"
android:layout_weight="1"
android:layout_margin="2dp"
android:textColor="#ffffff"
android:textSize="20sp"
android:padding="7dp"
android:layout_marginTop="10dp"
android:id="@+id/btnUpdate"
android:text="@string/app_name_updateproduct" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorDarkForest"
android:layout_weight="1"
android:textColor="#ffffff"
android:textSize="20sp"
android:layout_margin="2dp"
android:padding="7dp"
android:layout_marginTop="10dp"
android:id="@+id/btnDelete"
android:text="@string/app_name_deleteproduct" />
</LinearLayout>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/pbbar" />
<ListView
android:id="@+id/lstProducts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#808080"
android:layout_marginTop="5dp"
android:dividerHeight="1dp"
android:padding="5dp">
</ListView>
</LinearLayout>
</RelativeLayout>
lsttemplate.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="5"
android:padding="5dp"
android:layout_marginTop="2dp"
>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:layout_weight="1"
android:textSize="15sp"
android:id="@+id/lblProductCode"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#ffffff"
android:textSize="15sp"
android:width="40dip"
android:id="@+id/lblProductName"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#ffffff"
android:textSize="15sp"
android:paddingLeft="25dp"
android:id="@+id/lblProductPrice"/>
</LinearLayout>
でカスタムアダプターを使用することができます**リストビュー** - 'lstProduct.addHeaderView(。getLayoutInflater()膨らませる(R.layout.header、ヌル、偽)) ; '。後でキャンセルされました。 –