【问题标题】:can't getting data from cursor adapter无法从游标适配器获取数据
【发布时间】:2013-10-06 15:25:26
【问题描述】:

我有一个ListView(在Activity 中而不是在ListActivity 中),它利用自定义游标适配器从我的本地数据库中获取一些数据并将它们显示在ListView 中。

lv.setOnItemClickListener(new OnItemClickListener()
{
   @Override
   public void onItemClick(AdapterView<?> arg0, View view, int position, long id)
      {
            Log.i(tag, "position = " + position);
        Log.i(tag, "id is : " + id));
      }
});

假设我的数据库列如下:

身份证、姓名、姓氏、出生日期、身高、性别、出生地、婚姻状况。

但是,我在列表视图 (row.xml) 中只显示姓名和姓氏。 但每当用户点击列表中的某一行时,我也想检索其余数据,例如,所点击行的 id 或性别。

问题是,我没有显示列表中 db 行的所有信息,但是,当用户按下列表时,我需要检索该列表的一些数据。我该怎么做呢?

下面的方法不起作用,因为我不在ListActivity,只是Activity。

public void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position,  id);

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);
//get the data...
}

【问题讨论】:

  • 我不完全理解你问题的第一部分。关于第二部分:你不需要 ListActivity。只需将您的适配器存储为 Activity 类或 Fragment 的数据成员。
  • @NobuGames 我更新了问题看看。

标签: android sqlite android-listview cursor android-cursoradapter


【解决方案1】:

OnItemClickListener 中的arg0 参数ListView。但是,您可以这样做

lv.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {
            // This will get the cursor from the adapter, already moved to position
            Cursor cursor = (Cursor) mCursorAdapter.getItem(position)
            //get the data...
      }
});

【讨论】:

  • 你在哪里初始化 mCursorAdapter ? (你认为它已经是全球性的了??)
  • 那是你在lv.setAdapter()中设置的适配器
  • 它告诉我投射如下:Cursor cursor = (Cursor) mCursorAdapter.getItem(position);
  • 它有效。谢谢,我正在使用它,但我改变了它,因为你的代码更少: MyAdapter tempAdapter = (MyAdapter) adapterView.getAdapter();光标 c = tempAdapter.getCursor();c.moveToPosition(position);不知道,您的方法如何/为什么有效,非常感谢您的一些解释。
【解决方案2】:

getView 方法中你应该使用类似这样的东西

view.setTag(data); // you can pass here your specific data for each item

假设你的数据只是一个整数,那么你可以通过这种方式从onItemClick()获取这个值:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Integer data = (Integer) view.getTag();
    // your operation
}

【讨论】:

  • 您的意思是,我为不想显示的内容放置了一个隐藏的 textView,并通过您建议的方法获取值?听起来开销太大。
  • 不,我说的是使用 setTag 来识别列表中的项目。因此,当您对某个项目执行点击操作时,您可以获得该项目的 id。然后您可以使用该 ID 访问数据库中的数据 - 重要提示:在这种情况下,您不应使用回收项目,或者您需要使用新标签更新每个回收视图
  • 这是不必要的数据重复。看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多