我正在创建一个在数据库中存储名称和标记的应用程序,它会在列表视图中显示。如何通过长按listview中的项目来删除列表视图的项目以及数据库的项目?
以下是数据库助手的代码:
public class PersonDatabaseHelper {
private static final String TAG = PersonDatabaseHelper.class.getSimpleName();
// database configuration
// if you want the onUpgrade to run then change the database_version
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "mydatabase.db";
public static String query;
// table configuration
private static final String TABLE_NAME = "person_table"; // Table name
private static final String PERSON_TABLE_COLUMN_ID = "_id"; // a column named "_id" is required for cursor
private static final String PERSON_TABLE_COLUMN_NAME = "person_name";
private static final String PERSON_TABLE_COLUMN_PIN = "person_pin";
private DatabaseOpenHelper openHelper;
private SQLiteDatabase database;
// this is a wrapper class. that means, from outside world, anyone will communicate with PersonDatabaseHelper,
// but under the hood actually DatabaseOpenHelper class will perform database CRUD operations
public PersonDatabaseHelper(Context aContext) {
openHelper = new DatabaseOpenHelper(aContext);
database = openHelper.getWritableDatabase();
}
public void insertData (String aPersonName, String aPersonPin) {
// we are using ContentValues to avoid sql format errors
ContentValues contentValues = new ContentValues();
contentValues.put(PERSON_TABLE_COLUMN_NAME, aPersonName);
contentValues.put(PERSON_TABLE_COLUMN_PIN, aPersonPin);
database.insert(TABLE_NAME, null, contentValues);
}
public Cursor getAllData () {
String buildSQL = "SELECT * FROM " + TABLE_NAME;
Log.d(TAG, "getAllData SQL: " + buildSQL);
return database.rawQuery(buildSQL, null);
}
// this DatabaseOpenHelper class will actually be used to perform database related operation
private class DatabaseOpenHelper extends SQLiteOpenHelper {
public DatabaseOpenHelper(Context aContext) {
super(aContext, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// Create your tables here
String buildSQL = "CREATE TABLE " + TABLE_NAME + "( " + PERSON_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, " +
PERSON_TABLE_COLUMN_NAME + " TEXT, " + PERSON_TABLE_COLUMN_PIN + " TEXT )";
Log.d(TAG, "onCreate SQL: " + buildSQL);
sqLiteDatabase.execSQL(buildSQL);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
// Database schema upgrade code goes here
String buildSQL = "DROP TABLE IF EXISTS " + TABLE_NAME;
Log.d(TAG, "onUpgrade SQL: " + buildSQL);
sqLiteDatabase.execSQL(buildSQL); // drop previous table
onCreate(sqLiteDatabase); // create the table from the beginning
}
}
public void average() {
String query = "SELECT AVG("+PERSON_TABLE_COLUMN_PIN +") FROM "+TABLE_NAME;
database.rawQuery(query, null);
}
}
答案 0 :(得分:1)
好吧,既然你有一个与数据库中每个条目相关联的唯一ID,你可以根据它删除,如下所示:
public void deleteItem(int itemId){
this.getWritableDatabase().delete(TABLE_NAME, PERSON_TABLE_COLUMN_ID + "=" + itemId, null);
}
然后,当ListView
中的某个项目被长按时,您可以调用该方法将其从数据库中删除,然后在remove(Object)
上调用Adapter
(或{ remove(int)
List
使用Adapter
上的notifyDataSetChanged()
,然后是ListView
,以确保正确更新显示。
编辑:要回答有关如何将长按一下聆听者应用于Adapter
中的项目的问题,这取决于您实施{{1}的方式}。如果它是自定义适配器,您只需将onLongClickListener()
设置为根View
(例如convertView)即可。如果您没有使用它,可以尝试将AdapterView.OnItemLongClickListener
这样的ListView
附加到listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long arg3) {
// get the data from your list at position, i.e. data.get(position)
// then pass that object / id to your database helper, e.g.
Person p = data.get(position);
personDatabaseHelper.deleteItem(p.getId());
data.remove(position); // or adapter.remove(p), depends on your implementation
adapter.notifyDataSetChanged(); // remove the object from your Adapter and notify it of the change
return true;
}
});
:
Edit 2:
public View getView(final int position, View convertView, ViewGroup parent){
// your other stuff here
convertView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Person p = getItem(position);
personDatabaseHelper.deleteItem(p.getId());
remove(p);
notifyDataSetChanged();
return true;
}
});
return convertView;
}
使用自定义适配器
在getView()方法中,在返回convertView之前添加以下内容:
import Foundation
extension NSDate{
var stringValue: String{
return self.toString()
}
func toString() -> String {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MMM-dd"
let str = formatter.stringFromDate(self)
return str
}
}
extension String{
var dateValue: NSDate?{
return self.toDate()
}
func toDate() -> NSDate? {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MMM-dd"
if let date = formatter.dateFromString(self) {
return date
}else{
// if format failed, Put some code here
return nil // an example
}
}
}
extension NSDate{
var starttimestringValue: String{
return self.tostarttimeString()
}
func tostarttimeString() -> String {
let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
let str = formatter.stringFromDate(self)
return str
}
}
extension String{
var starttimedateValue: NSDate?{
return self.tostarttimeDate()
}
func tostarttimeDate() -> NSDate? {
let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
if let date = formatter.dateFromString(self) {
return date
}else{
// if format failed, Put some code here
return nil // an example
}
}
}
extension NSDate{
var endtimestringValue: String{
return self.toendtimeString()
}
func toendtimeString() -> String {
let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
let endstr = formatter.stringFromDate(self)
return endstr
}
}
extension String{
var endtimedateValue: NSDate?{
return self.toendtimeDate()
}
func toendtimeDate() -> NSDate? {
let formatter = NSDateFormatter()
formatter.dateFormat = "HH:mm"
if let date = formatter.dateFromString(self) {
return date
}else{
// if format failed, Put some code here
return nil // an example
}
}
}