- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作包含书签的webview应用程序,我使用光标成功将项目添加到listView中,并且SQLite 数据库,但我的问题是我无法获取项目的位置并删除它,我尝试以自己的方式进行操作,但我得到的是我已删除所有内容的 ListView 。这是我的MainActivity,我做了一个longClickItemListener来删除长按时的 ListView 项目,这是我的BookmarkDatabase
主要 Activity
final Dialog bookmarksScreen = new Dialog(this);
bookmarksScreen.requestWindowFeature(Window.FEATURE_NO_TITLE);
bookmarksScreen.setContentView(R.layout.activity_bookmark);
bookmarksScreen.setCancelable(true);
final ListView listView = bookmarksScreen.findViewById(R.id.bookmark_list);
ImageView bookmarkBack = bookmarksScreen.findViewById(R.id.close_bookmarks);
ImageView bookmarkDelete = bookmarksScreen.findViewById(R.id.delete_table);
// populate an ArrayList<String> from the database and then view it
final ArrayList<String> theList = new ArrayList<>();
Cursor data = bookmarkDB.getListContents();
// check if there is no data on database
if(data.getCount() == 0){
Log.d("Database Bookmark", "There is no items on item list");
} else {
while(data.moveToNext()) {
// add data into table "COL1" and "COL2"
theList.add(data.getString(1));
ListAdapter listAdapter = new ArrayAdapter<>(this, R.layout.activity_listitem, theList);
listView.setAdapter(listAdapter);
}
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = parent.getItemAtPosition(position).toString();
webView.loadUrl(item);
bookmarksScreen.dismiss();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
final int which_item = position;
// here i want to delete listview item
return true;
}
});
bookmarkBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookmarksScreen.dismiss();
}
});
bookmarkDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showConfirmDialog();
bookmarksScreen.dismiss();
}
});
bookmarksScreen.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
bookmarksScreen.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
bookmarksScreen.show();
书签数据库
package com.rixhion.mint.databases;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BookmarksDatabase extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "bookmarks.db";
public static final String TABLE_NAME = "bookmarks_data";
public static final String COL1 = "ID";
public static final String COL2 = "ITEM1";
public BookmarksDatabase(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " + " ITEM1 TEXT)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean addData(String item1) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL2, item1);
long result = db.insert(TABLE_NAME, null, contentValues);
//if date as inserted incorrectly it will return -1
if (result == -1) {
return false;
} else {
return true;
}
}
public Cursor getListContents(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
return data;
}
public Cursor deleteSpecificContents() {
SQLiteDatabase db = this.getWritableDatabase();
// Here i want to get the position of item and delete it
}
}
最佳答案
理想情况下,您将在 View 中可检索的地方使用主键(或者反之亦然,使用已在可检索的地方使用的值作为主键)。由于这里的主键是一个 auto_increment 字段,因此它与您尝试删除的 View 之间没有真正可靠的关联(至少从我在您的代码中看到的)。一种方法是为列表使用自定义 Adapter
,而不是 ArrayAdapter
,并使用 View.setTag()
和 View.getTag()
方法来存储每个列表项的主键。您可以查看如何执行此操作 here ,以及一些在线定制适配器教程。
假设您的 activity_listitem
布局有一个 ID 为 text_view
的 TextView
,您可以在其中显示从数据库中获取的文本,并且您可以在其中显示添加了存储主键的标签,您可以在主 Activity 中执行以下操作:
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
TextView textView = (TextView) view.findViewById(R.id.text_view);
final Integer which_item = (Integer) textView.getTag(); //Assuming you stored the ID as an Integer
int rowsDeleted = bookmarksDB.deleteSpecificContent(which_item);
if(rowsDeleted == 0){ //should be 1, since we're deleting by Primary Key
//if you would like like, handle if nothing was deleted
}
return true;
}
});
在您的 BookmarksDatabase 类中:
public int deleteSpecificContents(int id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, COL1 + "=?", new String[]{Integer.toString(id)});
}
<小时/>
如果您不想使用自定义适配器,另一种方法是使用列表中的位置来确定要删除的项目。您可以通过查询数据库并迭代光标
直到它与列表中项目的位置匹配来完成此操作。
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Cursor data = bookmarkDB.getListContents();
int i = 0;
while(data.moveToNext()){
if(i == position){
break;
}
i++;
}
int rowsDeleted = bookmarkDB.deleteSpecificContent(data.getInt(0));
//again, handle if rowsDeleted != 1 if you want
return true;
}
});
您的 BookmarkDatabase.deleteSpecificContent()
方法与第一种方法完全相同 - 唯一的区别在于您如何确定要删除的项目的 id。如果您不想处理 deleteSpecificContent()
不返回 1 的情况(除非我在这里遗漏了一些主要内容,否则在您的用例中它应该始终返回 1 ),请随意将其签名更改为 void
,而不是 int
。
请注意,第二种方法比第一种方法更昂贵,因为它需要额外的数据库查询,并且可能会在 Cursor
上进行多次迭代。虽然它需要更少的新/更改的代码,但可能不建议使用(老实说,我不能肯定地说。它可能适合您的用例,具体取决于数据库的大小,但是 - 全面披露 - 我对 Android 的经验不足,无法进行此调用。请自行决定使用)。
关于java - 如何使用光标获取项目的位置并删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666841/
我有一个包含透明区域的 png,并将其设置为图像标签。 当光标位于图像的不透明部分上时,如何将光标设置为手? 谢谢 最佳答案 为此,您需要查看位图本身。 WPF 的 HitTest 机制认为任何使用“
我想隐藏圆形仪表的手(那就是中间的东西,对吧?)。到目前为止,我尝试过: myCircularGauge.getHand().setVisible(false); 但是,绘制图表时这似乎会产生崩溃。如
我有两张图片:一张是张开的手,一张是抓着的手。我希望一个简单的“onmousedown”和“onmouseup”函数有助于制作出著名的抓手,您可以在类似谷歌地图的东西中看到它。但...抱歉,从头开始:
是否可以在sequelize迁移中使用光标?我正在尝试创建 DML 脚本,其想法是循环表中的值,即。使用游标输入日期,然后将值插入到其他表中,即。光标内的膳食日。 table : day dayId
我正在尝试使用格式加载值 +02:00 - mysql> select SUBSTR('2016-01-12T14:29:31.000+02:00',24,6); +02:00
我一直在尝试构建一个基于网络的文本编辑器。作为该过程的一部分,我正在尝试动态创建和修改基于元素的事件和用于字体编辑的击键事件。在这个特别的jsfiddle示例 我试图在按下 CTRL+b 并将焦点/插
我同时使用了 supertab 和 snipmate 插件。假设我正在使用 snipmate 创建一个 if 语句结构。在 if 语句中完成添加语句后,如何快速将光标移动到 if 语句之后。例如: i
我正在为我的 BlackBerry 项目创建一个搜索框,但看起来 BlackBerry 没有用于创建单行 EditField 的 API。我通过扩展 BasicEditField 和覆盖布局和绘制等方
我想知道如何获得 not-allowed光标在我禁用的链接上。我试图将它添加到禁用事件中,但它在那里不起作用,然后我尝试使用相同的光标事件引入悬停效果。关于如何让它发挥作用的任何想法?我在这里包含了我
在 Delphi 6 中,我可以使用 Screen.Cursor 更改所有表单的鼠标光标: procedure TForm1.Button1Click(Sender: TObject); begin
这个 Meteor 服务器代码需要每 n 秒从集合中打印一次文档,我该如何让它工作?谢谢 myCol.find({abc: undefined}).forEach( fun
在这个论坛上花了相当长的时间寻找与我的问题类似的答案,但找不到符合我的情况的答案。 我有一个 HTML 表单,通过 javascript 将其提交到我的 aspx 页面。 function Submi
是否可以在网页上创建透明的 HTML 光标?我使用 div 作为光标,我想让 div 50% 透明: http://jsfiddle.net/mCgmP/16/ I want this cursor
我正在使用 Cursor 来获取存储在我的 SQLite 数据库中的一些数据。当我的光标有数据库中的一些数据时,代码可以正常工作。但是,当 Cursor 不包含任何数据时,我在 Cursor.move
我希望隐藏特定范围的 x 和 y 位置中的光标。这是一些示例代码,代表了我想要做的事情。 if(x >= xLowerBound && x = yLowerBound + 20 && y = xLow
我有一个 .jsp 页面,用户可以在其中输入信息,然后使用保存按钮保存。该应用程序可以运行,但由于按钮的单击事件正在运行 Java 代码,然后将保存的信息添加到 Oracle 数据库,因此需要一些时间
为什么 Android 中 Cursor 没有 moveBeforeFirst()? 其他风格的 Java 中也有类似的方法,如果您需要重新迭代结果集(例如,在 while(cursor.moveTo
我想使用 Tkinter 捕获相对鼠标运动。我附上一个监听器并且能够获取鼠标移动。但是,我希望能够“捕获”/“锁定”光标,使其不可见并且无法离开窗口(就像游戏一样)。我的目标是获得相对鼠标移动而不受窗
当应用程序同步时,我尝试更新数据库中每一行的“html”列。我用过这个教程Here将应用程序添加到“配置文件”列表中。这是我在 SyncAdapter 中使用的代码: private static v
我正在使用 Uploadify带有图像按钮。一切正常。除了,我需要在鼠标悬停时使用 cursor:crosshair; 而不是 cursor:default;。 我试着在 CSS 中这样设置它: ob
我是一名优秀的程序员,十分优秀!