- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍然在思考 ContentProvider、Loaders 和 SimpleCursorAdapter(我发现使用旧的 startManagingCursor 方法更容易)。本质上,我有一个 ListView Activity ,当单击列表项时,将打开一个新 Activity ,该 Activity 的所有字段都填充了数据库中的数据。然后用户可以删除记录,或更改字段并保存更改。对于这篇文章的篇幅,我提前表示歉意,但我不确定哪些内容可能相关/可能不相关。
我会先向您提供旧代码(它正在运行):
public class FuncLogbook extends DashMenuActivity implements OnItemClickListener {
private ListView list_LogbookResults;
private ListAdapter list_LogbookAdap;
private ArrayList<DBDetails> LogbookArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView (R.layout.dash_logbook);
list_LogbookResults = (ListView) findViewById(R.id.list_logbook);
list_LogbookResults.setOnItemClickListener(this);
LogbookArrayList = new ArrayList<DBDetails>();
list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
list_LogbookResults.setAdapter(list_LogbookAdap);
}
@SuppressWarnings("deprecation")
public List<String> populateList() {
List<String> BGLResultsList = new ArrayList<String>();
DBProvider mDBLogbook = new DBProvider();
AddDBHelper logbook = new AddDBHelper(this);
logbook.open();
Cursor cur = logbook.getEntries();
Cursor cur = mDBLogbook.query(DBProvider.CONTENT_URI, null, null, null, null);
startManagingCursor(cur);
while (cur.moveToNext()) {
String RowID = cur.getString(0);
String Time = cur.getString(1);
String Date = cur.getString(2);
String BGL = cur.getString(5);
DBDetails detailsClass = new DBDetails();
detailsClass.setuRow(RowID);
detailsClass.setuTime(Time);
detailsClass.setuDate(Date);
detailsClass.setuBGL(BGL);
LogbookArrayList.add(detailsClass);
BGLResultsList.add("BGL: " + BGL + "\nRow ID: " + RowID
+"\nDate: " + Date +"\nTime: " + Time);
}
return BGLResultsList;
}
@Override
protected void onResume() {
super.onResume();
LogbookArrayList = new ArrayList<DBDetails>();
list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
list_LogbookResults.setAdapter(list_LogbookAdap);
}
@Override
protected void onStart() {
super.onStart();
LogbookArrayList = new ArrayList<DBDetails>();
list_LogbookAdap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
list_LogbookResults.setAdapter(list_LogbookAdap);
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);
DBDetails clickedObject = LogbookArrayList.get(arg2);
Bundle dataBundle = new Bundle();
dataBundle.putString("clickeduRowId", clickedObject.getuRow());
dataBundle.putString("clickeduTime", clickedObject.getuTime());
dataBundle.putString("clickeduDate", clickedObject.getuDate());
dataBundle.putString("clickeduBGL", clickedObject.getuBGL());
UpdateDBDetails.putExtras(dataBundle);
startActivity(UpdateDBDetails);
}
新代码:
public class FuncLogbook extends ListActivity implements
LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
private SimpleCursorAdapter adapter;
private ArrayList<DBDetails> LogbookArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView (R.layout.dash_logbook);
this.getListView().setDividerHeight(2);
fillData();
ListView list = getListView();
list.setOnItemClickListener(this); }
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
}
private void fillData() {
String[] from = new String[] { AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID,
AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME };
int[] to = new int[] {R.id.logBGL, R.id.logRowID, R.id.logCateg, R.id.logTime };
getLoaderManager().initLoader(0, null, this);
adapter = new SimpleCursorAdapter(this, R.layout.logbook_item, null, from, to, 0);
setListAdapter(adapter);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = { AddDBHelper.KEY_ROWID, AddDBHelper.KEY_BGL,
AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME };
CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
projection, null, null, null);
return cl;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);
/*DBDetails clickedObject = LogbookArrayList.get(pos);
Bundle dataBundle = new Bundle();
dataBundle.putString("clickeduRowId", clickedObject.getuRow());
dataBundle.putString("clickeduTime", clickedObject.getuTime());
dataBundle.putString("clickeduDate", clickedObject.getuDate());
dataBundle.putString("clickeduBGL", clickedObject.getuBGL());
UpdateDBDetails.putExtras(dataBundle);*/
startActivity(UpdateDBDetails);
}
运行它时,我在读取 DBDetails clickedObject = LogbookArrayList.get(pos);
的行上收到 NullPointerException我知道 ArrayList 是错误的,但我能找到的唯一教程要么展示如何将 ArrayList 与 onItemClick 一起使用,要么展示如何在 Toast 消息中使用选定的 id,但我似乎无法将信息放入要传递给 Activity 的 Bundle。感谢您的帮助。
更新
根据Luksprog的回答,我修改为
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);
Cursor c = (Cursor) adapter.getItem(pos);
Toast.makeText(getApplicationContext(), "Clicked Record Number " + id + " at " + pos,
Toast.LENGTH_SHORT).show();
Bundle dataBundle = new Bundle();
dataBundle.putString("clickeduRowId", c.getString(c.getColumnIndex(AddDBHelper.KEY_ROWID)));
dataBundle.putString("clickeduTime", c.getString(c.getColumnIndex(AddDBHelper.KEY_TIME)));
dataBundle.putString("clickeduDate", c.getString(c.getColumnIndex(AddDBHelper.KEY_DATE)));
dataBundle.putString("clickeduBGL", c.getString(c.getColumnIndex(AddDBHelper.KEY_BGL)));
UpdateDBDetails.putExtras(dataBundle);
startActivity(UpdateDBDetails);
}
如果我没有向游标添加强制转换,则会引发错误,因此 Cursor c = (Cursor) adapter.getItem(pos);
这仍然不起作用。 Logcat 显示:
10-21 23:24:02.167: E/CursorWindow(2663): Failed to read row 2, column -1 from a CursorWindow which has 8 rows, 4 columns.
10-21 23:24:02.178: E/AndroidRuntime(2663): FATAL EXCEPTION: main
10-21 23:24:02.178: E/AndroidRuntime(2663): java.lang.IllegalStateException: Couldn't read row 2, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.database.CursorWindow.nativeGetString(Native Method)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.database.CursorWindow.getString(CursorWindow.java:434)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.database.CursorWrapper.getString(CursorWrapper.java:114)
10-21 23:24:02.178: E/AndroidRuntime(2663): at com.rone.glucometer.FuncLogbook.onItemClick(FuncLogbook.java:227)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.widget.AbsListView$1.run(AbsListView.java:3529)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.os.Handler.handleCallback(Handler.java:615)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.os.Handler.dispatchMessage(Handler.java:92)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.os.Looper.loop(Looper.java:137)
10-21 23:24:02.178: E/AndroidRuntime(2663): at android.app.ActivityThread.main(ActivityThread.java:4745)
10-21 23:24:02.178: E/AndroidRuntime(2663): at java.lang.reflect.Method.invokeNative(Native Method)
10-21 23:24:02.178: E/AndroidRuntime(2663): at java.lang.reflect.Method.invoke(Method.java:511)
10-21 23:24:02.178: E/AndroidRuntime(2663): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-21 23:24:02.178: E/AndroidRuntime(2663): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-21 23:24:02.178: E/AndroidRuntime(2663): at dalvik.system.NativeStart.main(Native Method)
更新我意识到上面的 logcat 错误是由于我没有列出 onCreateLoader 中的所有列;为了简单和减小大小,我在这个例子中只列出了 4 列,但我有接近 15 列。谢谢,您的代码运行完美 Luksprog
最佳答案
您的第二次尝试无效,因为您使用的是相同的 ArrayList
,但现在未初始化,因为您使用的是基于 Cursor
的适配器。相反,您应该从适配器获取 Cursor
(使用 getItem(position)
方法,您将在正确的行获得 Cursor
位置)并从中获取数据:
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
Intent UpdateDBDetails = new Intent(this, UpdateDBDetails.class);
Cursor c = adapter.getItem(position);
Bundle dataBundle = new Bundle();
dataBundle.putString("clickeduRowId", c.getString(c.getColumnIndex(the_index_for_this_column_data))); // One of the fields from AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID, AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME
// the same for the other fields.
UpdateDBDetails.putExtras(dataBundle);
startActivity(UpdateDBDetails);
}
此外,为了安全起见,请在实例化适配器后调用 LoaderManager
。
关于android - 从 ArrayList<> 更改为 SimpleCursorAdapter 后使用 onItemClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997357/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!