繁体   English   中英

Android SimpleCursorAdapter和数据库更新

[英]Android SimpleCursorAdapter and Database Update

我刚开始从事Android开发,到目前为止,我一直很喜欢。 为了获得一些经验,我正在编写一个小的待办事项应用程序。 在我的数据库中,我有一个待办事项的状态,表示为int。 我在列表视图中使用一个复选框来表示此状态。 要将数据绑定到视图,我使用SimpleCursorAdapter的子类。 我将onClickListener添加到复选框中,以更新数据库中已用列表项的状态。 问题是,如果我使用以下代码,则该列表会在显示屏幕中搞砸(将检查许多项目):

@Override
public View getView(final int pos, View inView, ViewGroup parent) {
  View view = inView;
  if (view == null) {
    LayoutInflater inflater = (LayoutInflater) context
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.toodoolist_item, null);
  }
  cursor.moveToPosition(pos);
  ...

  checkBox.setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {
        int state = 0;
        if (checkBox.isChecked()) {
        titleView.setPaintFlags(titleView.getPaintFlags()
            | Paint.STRIKE_THRU_TEXT_FLAG);
        titleView.setEnabled(false);
        state = 1;
     } else {
        titleView.setPaintFlags(titleView.getPaintFlags()
            ^ Paint.STRIKE_THRU_TEXT_FLAG);
        titleView.setEnabled(true);
     }

     ContentValues values = new ContentValues();
     values.put(TooDooTable.STATE, state); 
     context.getContentResolver()
        .update(ContentUris.withAppendedId(
     TooDooTable.CONTENT_URI, id), values, null, null);
     cursor.requery();
  }
}

我当前的解决方法是每次使用充气机,即使inView不为null:

 @Override
 public View getView(final int pos, View inView, ViewGroup parent) {
   View view = inView;
   LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   view = inflater.inflate(R.layout.toodoolist_item, null);
  ...

这行得通,但是我不明白为什么我必须这样做。

在CurserAdapter中更新数据库并使更改立即反映在视图中的最佳实践是什么?

谢谢

使用notifyDataSetChanged而不是重新查询,并且如果以前的方法没有执行任何操作,则可以在视图上使用invalidate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM