相关文章推荐
仗义的面包  ·  python ...·  2 年前    · 
直爽的哑铃  ·  sql loader - Oracle ...·  3 年前    · 
会开车的罐头  ·  bootstrap-datetimepick ...·  3 年前    · 

Android:删除数据库记录后,如何重新查询游标以刷新ListView?

9 人关注

这可能是一个新手问题,但我对所有这些SQLite-Database-Cursor-Adapter-ListView-Do-It-Properly-Stuff相当陌生。

我有什么。

在我的 MainActivity 中我有一个 ListView 。我使用一个 SQLite database ,并用一个自定义的适配器扩展 SimpleCursorAdapter 来填充 ListView 。通过点击我的 ActionBar 中的一个项目我激活了 Contextual Action Mode 。到目前为止,一切都在工作。

我想要什么。

通过点击我的 ListView item 中的某个图标,相应的数据库行应该被删除, ListView 应该被刷新。

My question:

我如何正确刷新我的 Cursor 和我的 ListView ?当我在我的 OnClickListener 中不使用 cursor.requery() 而使用 cursor = dbm.getIOIOSensorsCursor() 时,我在下面几行得到一个 CursorIndexOutOfBoundsException

int state = cursor.getInt(cursor.getColumnIndex(IOIOSensorSchema.STATE));

我的应用程序崩溃了,但在重新加载后,数据库已被删除,并且根据ListView item已经消失。

我猜测崩溃一定与获取getView方法中的_position有关,因为_positionfinal。然而,当我使用cursor.requery()时,一切都在正常工作。

但是这个方法已经被废弃了,它的文档说"Don't use this...".我是一个正确编码的朋友(我还是个初学者,想以正确的方式学习编码,而不是速成的),想知道如何正确地做这个。我不知道这是否重要,但我只在我的(非常快)Nexus 4上测试我的应用程序。刷新Cursor的速度似乎没有问题,但我想知道它是否能在较慢的设备上工作。如果这对你很重要的话,我的数据库将包含大约10-20行,大约12列。我想这是一个非常小的数据库。

下面是我的自定义适配器的相关代码。

public class IOIOSensorCursorAdapterCam extends SimpleCursorAdapter
static class ViewHolder
ImageView stateIV, removeIV;
TextView nameTV, pinNumberTV, feedIDTV, freqTV;
private Context ctx;
private Cursor cursor;
private IodDatabaseManager dbm;
public IOIOSensorCursorAdapterCam(Context _context, int _layout,
    Cursor _cursor, String[] _from, int[] _to, int _flags)
super(_context, _layout, _cursor, _from, _to, _flags);
ctx = _context;
cursor = _cursor;
dbm = new IodDatabaseManager(_context);
@Override
public View getView(final int _position, View _convertView,
    ViewGroup _parent)
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) ctx
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// There is no view at this position, we create a new one. In this case
// by inflating an xml layout.
if (_convertView == null)
    // Inflate a layout
    _convertView = inflater.inflate(R.layout.listview_item_sensor_cam,
        null);
    holder = new ViewHolder();
    holder.stateIV = (ImageView) _convertView
        .findViewById(R.id.stateImageView);
    holder.nameTV = (TextView) _convertView
        .findViewById(R.id.sensorNameTextView);
    holder.pinNumberTV = (TextView) _convertView
        .findViewById(R.id.sensorPinNumberTextView);
    holder.feedIDTV = (TextView) _convertView
        .findViewById(R.id.sensorFeedIDTextView);
    holder.freqTV = (TextView) _convertView
        .findViewById(R.id.sensorFrequencyTextView);
    holder.removeIV = (ImageView) _convertView
        .findViewById(R.id.removeImageView);
    _convertView.setTag(holder);
// We recycle a View that already exists.
    holder = (ViewHolder) _convertView.getTag();
// Set an OnClickListener to the "Delete Icon"
holder.removeIV.setOnClickListener(new OnClickListener()
    @SuppressWarnings("deprecation")
    @Override
    public void onClick(View _view)
    cursor.moveToPosition(_position);
    // Delete sensor from database here
    int sensorID = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.SENSOR_ID));
    dbm.deleteIOIOSensor(sensorID);
    // This leads to a "CursorIndexOutOfBoundsException" and cannot
    // be used to refresh the ListView
//      cursor = dbm.getIOIOSensorsCursor();
    // Refresh ListView
    cursor.requery();
    notifyDataSetChanged();
cursor.moveToPosition(_position);
if (cursor.getCount() > 0)
    int state = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.STATE));
    if (state == 0)
    holder.stateIV.setImageResource(R.drawable.av_play_over_video);
    holder.stateIV.setColorFilter(ctx.getResources().getColor(
        R.color.hint_lighter_gray));
    // _convertView.setAlpha((float) 0.5);
    holder.nameTV.setTextColor(ctx.getResources().getColor(
        R.color.hint_darker_gray));
    holder.stateIV.setImageResource(R.drawable.av_pause_over_video);
    holder.stateIV.setColorFilter(ctx.getResources().getColor(
        android.R.color.holo_green_light));
    // _convertView.setAlpha((float) 1);
    holder.nameTV.setTextColor(ctx.getResources().getColor(
        android.R.color.black));
    // Set the sensor's name to the according TextView
    String sensorName = cursor.getString(cursor
        .getColumnIndex(IOIOSensorSchema.NAME));
    holder.nameTV.setText(sensorName);
    // Set the sensor's pin number to the according TextView
    int pinNumber = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.PIN_NUMBER));
    holder.pinNumberTV.setText("" + pinNumber);
    // Set the sensor's feed ID to the according TextView
    int feedID = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.FEED_ID));
    holder.feedIDTV.setText("" + feedID);
    // Set the sensor's frequency to the according TextView
    int frequency = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.FREQUENCY));
    int timeUnit = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.TIME_UNIT));
    String frequencyTextViewText = "";
    switch (timeUnit)
    case IodIOIOSensor.TIME_UNIT_MINUTES:
    frequencyTextViewText = frequency + " min";
    break;
    case IodIOIOSensor.TIME_UNIT_HOURS:
    frequencyTextViewText = frequency + " h";
    break;
    default:
    frequencyTextViewText = frequency + " sec";
    break;
    holder.freqTV.setText(frequencyTextViewText);
return _convertView;

Edit:

以下是我在实施解决方案后的OnCickListener的相关代码。

// Set an OnClickListener to the "Delete Icon"
holder.removeIV.setOnClickListener(new OnClickListener()
    @Override
    public void onClick(View _view)
    cursor.moveToPosition(_position);
    // Delete sensor from database here
    int sensorID = cursor.getInt(cursor
        .getColumnIndex(IOIOSensorSchema.SENSOR_ID));
    dbm.deleteIOIOSensor(sensorID);
    Toast.makeText(ctx, R.string.toast_sensor_deleted,
        Toast.LENGTH_SHORT).show();
    // Refresh ListView
    cursor = dbm.getIOIOSensorsCursor();
    swapCursor(cursor);
    notifyDataSetChanged();
    
android
listview
android-sqlite
simplecursoradapter
android-cursor
kaolick
kaolick
发布于 2013-06-05
1 个回答
CommonsWare
CommonsWare
发布于 2013-06-05
已采纳
0 人赞同