自定义SimpleCursorAdapter - 刷新,更新DB

时间:2012-11-21 09:29:29

标签: android cursor alertdialog simplecursoradapter android-context

我今天的问题与我实施的自定义SimpleCursorAdapter有关。以下是我的活动onCreate()和自定义SimpleCursorAdapter

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    customSharedPreference = getSharedPreferences("myCustomSharedPrefs", Activity.MODE_PRIVATE);
    editor = customSharedPreference.edit();

    setContentView(R.layout.activity_1);
    op = new OperationsClass(getApplicationContext());
    op.open();

    Cursor cursor = op.getList();
    startManagingCursor(cursor);

    String[] columns = new String[] { "AAA", "BBB", "CCC"};
    int[] to = new int[] { R.id.entry_aaa,R.id.entry_bbb, R.id.entry_ccc};

    MyCursorAdapter mAdapter = new MyCursorAdapter(this, R.layout.custom_entry, cursor, columns, to);

    this.setListAdapter(mAdapter);

    op.close();
}

OperationsClass管理数据库,getList()函数返回条目的光标。

public class MyCursorAdapter extends SimpleCursorAdapter{

        private Context context;
        private MyCursorAdapter here = this;

        private int layout;

        public MyCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
            this.context = context;
            this.layout = layout;
        }

        @Override
        public View newView(final Context context, Cursor cursor, ViewGroup parent) {

            Cursor c = getCursor();

            final LayoutInflater inflater = LayoutInflater.from(context);
            View v = inflater.inflate(layout, parent, false);

            int col1 = c.getColumnIndex("aaa");
            String name1 = c.getString(col1 );
            int col2 = c.getColumnIndex("bbb");
            String name2 = c.getString(col2 );
            int col3 = c.getColumnIndex("ccc");
            int name3 = c.getInt(col3 );

            final TextView text1 = (TextView) v.findViewById(R.id.entry_aaa);
            final TextView text2 = (TextView) v.findViewById(R.id.entry_bbb);
            final TextView text3 = (TextView) v.findViewById(R.id.entry_ccc);

            text1.setText(name);
            text2.setText(name2);

            if (name3 == 0)
                text3.setText("Not checked");
            else {
                text3.setText("Checked");
                text3.setOnClickListener(new View.OnClickListener()
                    {
                        public void onClick(View view)
                        {
                        text3.setText("Not checked");
                            // Here I would like to update my DB using
                            // OperationsClass and the SharedPrefs,
                            // and refresh the ListView with the new
                            // text value.
                        }
                    });
                }
            }
            return v;
        }

        @Override
        public void bindView(View v, final Context context, Cursor c) {
            // Same operations as higher
        }
}

基本上我想要实现的是当用户点击第三列时刷新ListView,这意味着它的值发生了变化(已点击或未被点击)。同时我希望更新数据库和SharedPreferences(我可以创建两个类的新对象并从应用程序上下文中恢复,但这看起来很重)。


我还想知道在打开AlertDialog时是否有办法在一个活动中触发一个已实现的方法(在同一个应用程序中,我实际上想通过以下方法向我的数据库添加一个元素一个AlertDialog并使弹出它的Activity检索一个新游标并刷新它的List。。

2 个答案:

答案 0 :(得分:2)

“基本上我想要实现的是”

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    // if (the id of selected view matches what you want) {
    boolean checked;
    if (text3.getText().toString() == "checked") {
        boolean checked = true;
    } else {
        boolean checked = false;
    }
    op.updateRead(id, checked);     
    refreshCursorAdapter();
    setSharedPrefs();
    // }

“当用户点击第3列时刷新ListView,这意味着其值发生了变化(已被点击或未被点击)。”

private void refreshCursorAdapter() {
    Cursor cursor = op.getList();
    mAdapter.changeCursor(cursor);
}

“同时我希望更新数据库”

private boolean updateRead(long rowId, boolean checked) {
        ContentValues args = new ContentValues();
        if (checked) { 
            args.put("read", "1"); 
        } else { 
            args.put("read", "0");  
        }
        return db.update(DB_TABLE, args, "_id =" + rowId, null) > 0;
    }

“和SharedPrefereces”

private void setSharedPrefs() {
    SharedPreferences settings = getSharedPreferences("MYPREFS", 0);
    SharedPreferences.Editor editor = settings.edit();
    if (checked) { 
        editor.putBoolean("read", false);
    } else { 
        editor.putBoolean("read", true);
    }
    editor.commit();
}

“我还想知道在打开AlertDialog时是否有办法在一个活动中触发其中一个已实施的方法”

老实说,我不明白这个背后的神秘感是什么。该过程将涉及将相同的代码复制并粘贴到其他事件。

答案 1 :(得分:1)

  

基本上我想要实现的是刷新ListView时的   用户点击第3列,这意味着它的值发生了变化(有   被点击或未被点击过。同时我希望更新   DB和SharedPrefereces(我可以创建两者的新对象   类和从应用程序上下文中恢复,但似乎   很重)。

首先,您不应该在newView方法中实现该逻辑,因为由于回收,不会为每一行调用该方法。 newView仅应用于构建新的行视图,仅此而已。对任何行逻辑使用bindView方法。

关于onClick方法中的代码,我看不出你有什么问题。根据您的逻辑更新数据库,然后再次使用新数据查询数据库中的Cursor,然后使用swapCursor()使用新值更新适配器。这应该工作,但它不是推荐的方式,主要是因为你在主UI线程上进行每个数据库操作。不要使用startManagingCursor方法,因为此方法在主UI线程上运行查询,而是查看在活动中实现Loader以从主UI线程加载数据。使用Loader,您将更新数据库值,然后只需重新启动Loader即可更新列表。

  

我也想知道是否有办法触发其中一个   在AlertDialog发生时,在一个活动中实现了方法   打开(在同一个应用程序中,我实际上想要添加一个元素到我的   数据库通过AlertDialog并使其加速的活动   检索新游标并刷新其列表。

你没有说明你如何展示AlertDialog。如果要在添加新元素后更新列表,请使用AlertDialog按钮的侦听器以及与上面相同的代码。