- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可用的 sqlite 数据库,可以将项目添加到其中并通过 ListView 查看。我现在想动态地向每个 View 添加一个编辑/删除按钮。
按照教程 http://looksok.wordpress.com/2012/11/03/android-custom-listview-tutorial/我创建了一个带有编辑/删除按钮的自定义 XML 文件。然而,我无法按照该教程进行操作,因为它没有显示用于检索和显示 sqlite 信息。
自定义 ListView 的 XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<EditText
android:id="@+id/itemName"
android:layout_width="0sp"
android:layout_height="fill_parent"
android:layout_weight="2"
android:gravity="center_vertical"
android:hint="@string/title"
android:textAppearance="?android:attr/textAppearanceSmall" />
<EditText
android:id="@+id/itemQuantity"
android:layout_width="0sp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center"
android:inputType="numberDecimal"
android:text="@string/quantity"
android:textAppearance="?android:attr/textAppearanceSmall" />
<ImageButton
android:id="@+id/editItem"
android:layout_width="@dimen/width_button"
android:layout_height="fill_parent"
android:contentDescription="@string/app_name"
android:onClick="editOnClick"
android:src="@android:drawable/ic_menu_edit" />
<ImageButton
android:id="@+id/deleteItem"
android:layout_width="@dimen/width_button"
android:layout_height="fill_parent"
android:contentDescription="@string/app_name"
android:onClick="removeOnClick"
android:src="@android:drawable/ic_menu_delete" />
</LinearLayout>
当前库存 XML(显示 ListView 的位置):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/currentInventory"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
xmlns:tools="http://schemas.android.com/tools" >
<TextView android:layout_marginTop="5dip"
android:id="@+id/selectCat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/selectCategory"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/categoryChoose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/catergory_arrays" />
<ListView
android:id="@+id/customDbListView"
android:layout_width="match_parent"
android:layout_height="350dip"
android:layout_marginBottom="20dip"
android:layout_marginTop="20dip"
tools:listitem="@layout/list_view_custom" >
</ListView>
<Button
android:id="@+id/scanCurrent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="5dip"
android:text="@string/scan" />
<Button
android:id="@+id/editItemCurrent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="5dp"
android:text="@string/editItem" />
</LinearLayout>
创建数据库:
package com.example.fooditemmonitor;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public final class ItemDatabase {
// the Activity or Application that is creating an object from this class.
Context context;
// a reference to the database used by this application/object
private SQLiteDatabase db;
// These constants are specific to the database.
private final String DATABASE_NAME = "ItemDatabase.sqlite";
private final int DATABASE_VERSION = 7;
// These constants are specific to the database table.
private final String TABLE_NAME = "foodItems";
private final String COLUMN_NAME_ENTRY_ID = "entryid";
private final String COLUMN_NAME_BARCODE = "barcode";
private final String COLUMN_NAME_TITLE = "title";
private final String COLUMN_NAME_QUANTITY = "quantity";
private final String COLUMN_NAME_DATE = "date";
private final String COLUMN_NAME_CATEGORY = "category";
String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME;
String SQL_CREATE_TABLE = "create table " + TABLE_NAME + " ("
+ COLUMN_NAME_ENTRY_ID
+ " integer primary key autoincrement not null," + COLUMN_NAME_DATE
+ " date," + COLUMN_NAME_BARCODE + " text," + COLUMN_NAME_TITLE
+ " text," + COLUMN_NAME_QUANTITY + " int," + COLUMN_NAME_CATEGORY
+ " text" + ");";
public ItemDatabase(Context context) {
this.context = context;
// create or open the database
ItemDatabaseHelper helper = new ItemDatabaseHelper(context);
this.db = helper.getWritableDatabase();
}
public void addRow(String rowStringOne, String rowStringTwo,
String rowStringThree, String rowStringFour, int rowIntFive) {
// this is a key value pair holder used by android's SQLite functions
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_DATE, rowStringOne);
values.put(COLUMN_NAME_BARCODE, rowStringTwo);
values.put(COLUMN_NAME_TITLE, rowStringThree);
values.put(COLUMN_NAME_CATEGORY, rowStringFour);
values.put(COLUMN_NAME_QUANTITY, rowIntFive);
// ask the database object to insert the new data
try {
db.insert(TABLE_NAME, null, values);
} catch (Exception e) {
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
public void updateRow(long rowID, String rowStringOne, String rowStringTwo,
String rowStringThree, int rowIntFour) {
// this is a key value pair holder used by android's SQLite functions
ContentValues values = new ContentValues();
values.put(COLUMN_NAME_DATE, rowStringOne);
values.put(COLUMN_NAME_BARCODE, rowStringTwo);
values.put(COLUMN_NAME_TITLE, rowStringThree);
values.put(COLUMN_NAME_QUANTITY, rowIntFour);
// ask the database object to update the database row of given rowID
try {
db.update(TABLE_NAME, values, COLUMN_NAME_ENTRY_ID + "=" + rowID,
null);
} catch (Exception e) {
Log.e("DB Error", e.toString());
e.printStackTrace();
}
}
public void deleteRow(long rowID) {
// ask the database manager to delete the row of given id
try {
db.delete(TABLE_NAME, COLUMN_NAME_ENTRY_ID + "=" + rowID, null);
getAllRowsAsArrays();
} catch (Exception e) {
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
public ArrayList<ArrayList<Object>> getCategoryOfArrays(String category) {
// create an ArrayList that will hold all of the data collected from
// the database.
ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
// this is a database call that creates a "cursor" object.
// the cursor object store the information collected from the
// database and is used to iterate through the data.
Cursor cursor;
try {
// ask the database object to create the cursor.
cursor = db.query(TABLE_NAME, new String[] { COLUMN_NAME_DATE,
COLUMN_NAME_TITLE, COLUMN_NAME_QUANTITY,
COLUMN_NAME_CATEGORY }, COLUMN_NAME_CATEGORY + "='"
+ category + "'", null, null, null, COLUMN_NAME_TITLE
+ " ASC");
// move the cursor's pointer to position zero.
cursor.moveToFirst();
// if there is data after the current cursor position, add it to the
// ArrayList.
if (!cursor.isAfterLast()) {
do {
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cursor.getString(cursor
.getColumnIndex(COLUMN_NAME_DATE)));
dataList.add(cursor.getString(cursor
.getColumnIndex(COLUMN_NAME_TITLE)));
dataList.add(cursor.getInt(cursor
.getColumnIndex(COLUMN_NAME_QUANTITY)));
dataArrays.add(dataList);
} while (cursor.moveToNext());
}
// let java know that you are through with the cursor.
cursor.close();
} catch (SQLException e) {
Log.e("DB Error", e.toString());
e.printStackTrace();
}
// return the ArrayList that holds the data collected from the database.
return dataArrays;
}
public ArrayList<ArrayList<Object>> getAllRowsAsArrays() {
// create an ArrayList that will hold all of the data collected from
// the database.
ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
// this is a database call that creates a "cursor" object.
// the cursor object store the information collected from the
// database and is used to iterate through the data.
Cursor cursor;
try {
// ask the database object to create the cursor.
cursor = db.query(TABLE_NAME, new String[] { COLUMN_NAME_TITLE,
COLUMN_NAME_QUANTITY, COLUMN_NAME_CATEGORY }, null, null,
null, null, COLUMN_NAME_TITLE + " ASC");
// move the cursor's pointer to position zero.
cursor.moveToFirst();
// if there is data after the current cursor position, add it to the
// ArrayList.
if (!cursor.isAfterLast()) {
do {
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cursor.getString(cursor
.getColumnIndex(COLUMN_NAME_TITLE)));
dataList.add(cursor.getInt(cursor
.getColumnIndex(COLUMN_NAME_QUANTITY)));
dataArrays.add(dataList);
} while (cursor.moveToNext());
}
// let java know that you are through with the cursor.
cursor.close();
} catch (SQLException e) {
Log.e("DB Error", e.toString());
e.printStackTrace();
}
// return the ArrayList that holds the data collected from the database.
return dataArrays;
}
public class ItemDatabaseHelper extends SQLiteOpenHelper {
public ItemDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
// execute the query string to the database.
db.execSQL(SQL_CREATE_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade
// policy is to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
}
}
显示数据库数据的当前代码:
package com.example.fooditemmonitor;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
public class CurrentItems extends Activity {
ItemDatabase db;
Context context;
Button addButton, editButton;
ListView listView;
int spinnerID;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.current_inventory);
db = new ItemDatabase(this);
// create references and listeners for the GUI interface
setupViews();
// make the buttons clicks perform actions
addButtonListeners();
// display search results
displaySearch();
}
private void setupViews() {
// bring up current database items
listView = (ListView) findViewById(R.id.customDbListView);
// THE BUTTONS
addButton = (Button) findViewById(R.id.scanCurrent);
editButton = (Button) findViewById(R.id.editItemCurrent);
}
private void addButtonListeners() {
Spinner selectCat = (Spinner) findViewById(R.id.categoryChoose);
selectCat
.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
displaySearch();
}
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing
}
});
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(CurrentItems.this, AddItem.class));
}
});
editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(CurrentItems.this, EditItems.class));
}
});
}
public int getSelectedItemPosition() {
Spinner selectCat = (Spinner) findViewById(R.id.categoryChoose);
spinnerID = selectCat.getSelectedItemPosition();
return spinnerID;
}
private void displaySearch() {
// TODO Auto-generated method stub
Spinner selectCat = (Spinner) findViewById(R.id.categoryChoose);
spinnerID = selectCat.getSelectedItemPosition();
String catSelected;
final ArrayList<String> items = new ArrayList<String>();
final ArrayAdapter<String> itemArray;
itemArray = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items);
{
if (getSelectedItemPosition() == 0) {
ArrayList<ArrayList<Object>> data = db.getAllRowsAsArrays();
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nTitle: " + row.get(0).toString()
+ "\nQuantity: " + row.get(1).toString() + "\n");
itemArray.notifyDataSetChanged();
}
listView.setAdapter(itemArray);
} else if (getSelectedItemPosition() == 1) {
catSelected = "Fridge";
ArrayList<ArrayList<Object>> data = db
.getCategoryOfArrays(catSelected);
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nDate: " + row.get(0).toString()
+ "\nTitle: " + row.get(1).toString()
+ "\nQuantity: "
+ Integer.parseInt(row.get(2).toString()) + "\n");
itemArray.notifyDataSetChanged();
}
listView.setAdapter(itemArray);
} else if (getSelectedItemPosition() == 2) {
catSelected = "Can";
ArrayList<ArrayList<Object>> data = db
.getCategoryOfArrays(catSelected);
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nDate: " + row.get(0).toString()
+ "\nTitle: " + row.get(1).toString()
+ "\nQuantity: "
+ Integer.parseInt(row.get(2).toString()) + "\n");
itemArray.notifyDataSetChanged();
}
listView.setAdapter(itemArray);
} else if (getSelectedItemPosition() == 3) {
catSelected = "Fruit";
ArrayList<ArrayList<Object>> data = db
.getCategoryOfArrays(catSelected);
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nDate: " + row.get(0).toString()
+ "\nTitle: " + row.get(1).toString()
+ "\nQuantity: "
+ Integer.parseInt(row.get(2).toString()) + "\n");
itemArray.notifyDataSetChanged();
}
listView.setAdapter(itemArray);
} else if (getSelectedItemPosition() == 4) {
catSelected = "Vegetable";
ArrayList<ArrayList<Object>> data = db
.getCategoryOfArrays(catSelected);
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nDate: " + row.get(0).toString()
+ "\nTitle: " + row.get(1).toString()
+ "\nQuantity: "
+ Integer.parseInt(row.get(2).toString()) + "\n");
itemArray.notifyDataSetChanged();
}
listView.setAdapter(itemArray);
} else {
ArrayList<ArrayList<Object>> data = db.getAllRowsAsArrays();
for (int position = 0; position < data.size(); position++) {
ArrayList<Object> row = data.get(position);
items.add("\nTitle: " + row.get(0).toString()
+ "\nQuantity: " + row.get(1).toString() + "\n");
itemArray.notifyDataSetChanged();
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
}
当前代码仅将数据显示为常规 ListView 。我需要数据显示为:
标题数量(编辑按钮)(删除按钮)
所有帮助将不胜感激!谢谢
最佳答案
由于我有点无聊,我冒昧地实现了适配器。由于您没有发布相应的类表示,因此您必须编辑从数据库检索元素的方式以及访问类信息的方式。
但是,您可以实现 CursorAdapter 而不是 BaseAdapter。
public class QuantatiyAdapter extends BaseAdapter {
private Context context;
private List<Item> data;
public QuantatiyAdapter(Context context) {
this.context = context;
//TODO actually put all your data into that list.
this.data = Database.getAllData();
}
@Override
public int getCount() {
return this.data.size();
}
@Override
public Object getItem(int arg0) {
return this.data.get(arg0);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View converView, ViewGroup container) {
ViewHolder holder = null;
if (converView == null) {
converView = LayoutInflater.from(context).inflate(R.layout.cutomLayout, null);
holder = new ViewHolder();
holder.title = (TextView) converView.findViewById(R.id.itemName);
holder.quantity = (TextView) converView.findViewById(R.id.itemQuantity);
holder.edit = (ImageButton) converView.findViewById(R.id.editItem);
holder.delete = (ImageButton) converView.findViewById(R.id.deleteItem);
converView.setTag(holder);
} else {
holder = (ViewHolder) converView.getTag();
}
// filling text
holder.title.setText(getItem(position).getTitle());
// adding action listeners to buttons
holder.edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO fill methods for buttons
}
});
return converView;
}
private static class ViewHolder {
TextView title,quantity;
ImageButton edit,delete;
}
}
关于java - 通过CUSTOM listview显示SQLite信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368612/
我正在开发一个 SQLite 数据库。数据库已经填满了,但我想重构它。这是我需要做的一个示例: 我目前有一张 table : CREATE TABLE Cars (ID INTEGER PRIMARY
我正在使用 Mono、SQLite、Dapper 和 Dapper 扩展。我可以从数据库中读取数据,但插入不起作用。我正在使用 sqlite 的 Mono 驱动程序。 错误并不能提供太多信息,至少对我
我有一个使用 SQLite 的 Windows Phone 8 应用程序。该应用程序具有许多数据库功能,并包含一个 sqlite 数据库文件,在运行该应用程序时,该文件将被复制到本地文件夹并进行访问。
为 sqlite 创建索引时有排序顺序。 https://sqlite.org/lang_createindex.html Each column name or expression can be
顾名思义,我怀疑如果有一些引用被删除的表会发生什么,例如表的某些字段的索引。 SQLite是否会自动处理?在执行drop命令之前,数据库所有者是否应注意任何实例? 最佳答案 我认为不需要家政服务。 S
我想知道是否有可能将从计数中获得的整数转换为REAL 类似于以下内容(尽管这不起作用) SELECT CAST (COUNT (ColumnA) AS Count) AS REAL) FROM Tab
我无法在SQLite数据库上执行一些更新。我正在Windows上使用SQLite 3 Shell。 我正在运行以下命令: update resovled_chrom_counts set genus
我知道SQLite中的触发器顺序是不确定的(您不能确定将首先执行哪个触发器),但是表约束和触发器之间的关系又如何呢? 我的意思是,假设我在一个列中有一个UNIQUE(或CHECK)约束,并且在该表上有
我的 CustomTags 表可能有一系列“临时”记录,其中 Tag_ID 为 0,并且 Tag_Number 将有一些五位数的值。 定期,我想清理我的 Sqlite 表以删除这些临时值。 例如,我可
我有A,B,C和D的记录。 我的SQL1 SELECT * FROM main_table order by main_table.date desc limit 2返回A和B。 我的SQL2 SEL
select round(836.0)返回836.0 我如何删除sqlite查询中的尾随零。 836.00应该是836 836.440应该是836.44 最佳答案 如果需要836.44,则需要十进制返
我正在研究RQDA中的文本,并且正在使用Firefox SQLite Manager访问数据库,以便可以更轻松地搜索文件。我创建并填充了虚拟表: CREATE VIRTUAL TABLE texts
我有这样的数据: table1 id | part | price 1 | ox900 | 100 2 | ox980 | 200 和 table2 id | part | price 1
我正在尝试将一些数据插入现有的SQLite表中。该表和数据库是使用相同的API创建的,但是由于某种原因,插入操作无效,并且从不给我任何错误消息。 我正在BlackBerry 9550模拟器上对此进行测
例如,我在名为SALARY的列中插入一个值。如果插入的值大于1000,我想将字符串HIGH插入到RANK列中,否则将插入LOW中。 我可以使用SQLite做到吗? 最佳答案 在插入之前使用触发器,然后
假设我有一个包含三列A,B,C的表t1,其中(A,B)包含唯一键(具有数十万行)。由于90%的查询将采用SELECT C FROM t1 WHERE A =?和B = ?,我想我要为A,B和C提供覆盖
在一个SQLite3数据库中,我有一个表“ projects”,其id字段由以下方式组成: [user id]_[user's project id] 例如,用户ID = 45,这是一些数据: 45_
我了解PRAGMA foreign_key和ON DELETE RESTRICT/NO ACTION的概念,但是我面临的是另一种情况。 我需要删除一个父行,但保持与之关联的子行。例如: CREATE
我的c#应用程序从Web服务1读取文件列表,并将完整的文件名插入table1,然后从第二个Web服务读取list并将它们插入到table2。 这些表具有相同的结构,如下所示: create table
我在以下情况下尝试将Record1的ID更新为Record2的ID: 两个表中的名称相同,并且 在Record2中权重更大。 记录1 | ID | Weight | Name | |----|----
我是一名优秀的程序员,十分优秀!