0

我今天的问题与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并制作弹出它的活动up 检索一个新游标并刷新其列表)。

4

2 回答 2

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();
    // }

“当用户单击第三列时刷新 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 时是否有办法在一个活动中触发其中一个已实现的方法”

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

于 2012-11-21T10:20:24.133 回答
1

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

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

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

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

你没有说你是如何表现出来的AlertDialog。如果您想在添加新元素后更新列表,请使用AlertDialog按钮的侦听器和与上面相同的代码。

于 2012-11-21T10:05:05.780 回答