我今天的问题与我实施的自定义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。。
答案 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
按钮的侦听器以及与上面相同的代码。