我有一个小问题,在我点击列表项后,项目上的复选框不会改变状态。更新工作完美,setChecked可能,但退出和重新运行活动后将出现更改。我阅读了很多关于notifyDataSetChange()
的内容,它可能有用,但不是。我如何修复它,就像点击项目chechbox值后会发生变化。
public class SviatokPridajActivity extends Activity
{
private DatabaseOp mDbHelper;
ListView listview;
String username;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sviatok_pridaj);
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
listview = (ListView) findViewById(R.id.listSviatok);
showUserSettings();
mDbHelper = new DatabaseOp(this);
mDbHelper.open();
Cursor sviatokCursor = mDbHelper.fetchAllSviatokNastav(username, 3);
if (sviatokCursor.getCount()==0)
{
mDbHelper.naplnSviatky(username);
sviatokCursor = mDbHelper.fetchAllSviatokNastav(username, 3);
}
final SviatokCursorAdapter adapter = new SviatokCursorAdapter(this, sviatokCursor);
listview.setAdapter(adapter);
listview.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int stlpec, long arg3)
{
// TODO Auto-generated method stub
Cursor cur = (Cursor) adapter.getItem(stlpec);
String odosli = cur.getString(cur.getColumnIndex("_id"));
String zobraz = cur.getString(cur.getColumnIndex("dlzka"));
CheckBox check = (CheckBox)findViewById(R.id.checkBox);
if (Integer.parseInt(zobraz)==0)
{
mDbHelper.updateSviatok(odosli, username, 1);
} else {
mDbHelper.updateSviatok(odosli, username, 0);
}
check.setChecked(!check.isChecked());
adapter.notifyDataSetChanged();
}
});
}
@Override
public void onPause()
{
super.onPause();
mDbHelper.close();
}
private void showUserSettings()
{
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
username = sharedPrefs.getString("prefUsername", "NULL");
}
}
答案 0 :(得分:0)
您已在itemclick中检查了CheckBox
,但未将其反映到itemList中,因此在调用adapter.notifyDataSetChanged();
之前,您必须使用新更改刷新listItems。
答案 1 :(得分:0)
我在这里回答了这个问题:https://stackoverflow.com/a/22954806/1332870 你能检查一下吗?如果它不能解决您的问题,请告诉我
答案 2 :(得分:0)
重新加载Cursor
而不是adapter.notifyDataSetChanged();
使用adapter.changeCursor(reloadedCursor);
答案 3 :(得分:0)
不确定这是否是主线程上的压力,但您可以在点击方法中再次设置适配器。