当前位置: 首页 > 知识库问答 >
问题:

Android光标适配器列表视图

莫宁
2023-03-14

我有一个带有按钮的视图和一个列表视图,由包含bindView()和newView()的光标适配器支持,用于自定义视图。列表的每一行都包含一个Text和一个复选框。每个视图的数据来自数据库。我正在光标适配器构造函数中传递我的数据库适配器。当复选框被选中或取消选中时,我用它来更新数据库(效果很好)。当然,我对光标运行“重新查询”并view.refreshDrawableState())。这是个好主意吗?什么是更好的解决方案?

第二个问题更严重,当按钮被单击时,它会启动一个新活动。从新活动中点击后退按钮后,我返回了我的列表视图。但是当我这次尝试单击复选框时,我得到了数据库关闭异常。为什么?如何修复此错误?

以下是列表视图和代码片段。

        Button           --------> Starts a new activity

复选框|文本视图

复选框|文本视图

MyActivity.java

onCreate() {
    ...
    Button add_item_btn = (Button) findViewById(R.id.add_item_btn_id);
    add_item_btn.setOnclickListener(new OnClickListener() {
      //Start a new activity
    });
}

protected void onPause() {
   adapter.close();
   mCursor.close();
}

protected void onResume() {
  mListView = getListView();
  adapter = new DBAdapter(getApplication());
  adapter.open();
  mCursor = adapter.getAllItems();
  mCustomAdapter = new MyCursorAdapter(MyActivity.this, mCursor, adapter);
  mListView.setAdapter(mCustomAdapter); 
}
public class MyCursorAdapter extends CursorAdapter {
  Cursor mCursor;
  DBAdapter adapter;
  public MyCursorAdapter(Context context, Cursor c, DBAdapter _adapter)  {
    ...
    mCursor = c;
    adapter = _adapter;
  }

public void bindView(final View view, Context context, final Cursor cursor) {

  final CheckBox itemStatusCB = (CheckBox) 
  view.findViewById(R.id.item_status_id);

  idx = cursor.getColumnIndex(myItem.ITEM_STATUS);
  final long itemStatus = cursor.getLong(idx);

  if (itemStatus == 1) {
     itemStatusCB.setChecked(true);           
  } else {
     itemStatusCB.setChecked(false);           
  }

  itemStatusCB.setOnClickListener(new OnClickListener() {
     @Override public void onClick(View v) {
       int newStatus = 0;  
       if (((CheckBox) v).isChecked()) {
         newStatus = 1; 
       }
         adapter.updateItemStatus(itemId, newStatus);
         mCursor.requery();                           
         view.refreshDrawableState();
     });
  }

}}

共有1个答案

黄弘新
2023-03-14

我能够解决这个问题。调用的新活动在onStart()上打开了DB连接,在onDestroy()上关闭了DB连接。从那个活动返回后,我得到了数据库非法状态异常错误,如堆栈跟踪所述。我认为它返回了DB连接的缓存版本。一旦我删除了DB。在来宾活动中,它停止发出database not open错误。通常,您会认为每个活动都可以在其onResume()或onStart()中打开DB连接,并在其onPause()或onStop()或onDestroy()中关闭DB连接,并且不会影响跨活动的连接。这有意义吗?

 类似资料:
  • 我正在寻找在Android中使用列表适配器和Recyview适配器的区别。关于性能的任何不同,使用它们的利弊。

  • 问题内容: 嗨,您想创建一个自定义光标适配器,以便显示2行文本的图像。我在理解自定义光标适配器时遇到了一些麻烦,但是我不明白如何添加要从数据库路径填充的imageview。 问题答案: 将, 实际上,我已经实现了与您正在寻找的东西非常相似的东西。这是我的实现。 XML只是万一… 根据特定条件,这将在文本的两行显示最多2幅图像。 希望这可以为您的工作打下基础! 祝好运 :]

  • 我已经为android adapter view上的read onclick项编写了一个代码, 我正在传递它正在使用的信息 在我的第二个类页面上显示如下输出: {描述=关于选定的描述,标题=选定的标题} 我只想知道如何分别显示描述和标题。 如: 所选标题(显示在一个文本视图上)关于所选内容的说明(显示在另一个文本视图上) 第一类 ------------ public void onItemCli

  • 我正在开发一个聊天应用程序,我正在使用光标适配器来显示聊天列表。聊天备份在服务器上,我们加载了更多聊天功能,允许用户从服务器获取他的最后50次聊天。 此loadmore按钮位于列表的顶部。 因此,当我将这些新聊天添加到我的数据库并交换光标以重新加载listview时,listview滚动位置不会被维护,列表会转到顶部,这不是正确的行为。我想保持listview滚动位置,就像按下load more聊

  • 我很难用简单的游标适配器从sqlite数据库填充微调器。我必须使用一个简单的游标适配器,而不是数组适配器。我的主要活动、函数和xml文件如下: 功能如下: xml文件在下面; 当我运行应用程序时,将显示以下屏幕。有数据,但似乎是空的。我有_ id,列的名称。 空微调器 谢谢你的帮助。

  • 我有一个光标适配器显示的项目列表,当我使用时,我得到了正确的行并且能够做我需要的事情(我的目标是在单击时向该项目添加视图。现在我需要在单击单元格中的按钮时发生此操作。但是,按钮单击事件不会返回正确的单元格,而是随机返回列表中的其他单元格,这是我的代码中的一个示例: 在这个示例代码中,我想要单击单元格中的按钮,让我访问按钮真正所在的视图,但是我从随机列表单元格中获取视图,如何在我的单击侦听器中获取正