I am trying to implement the following code:
public CheckBox checkboxer() {
final CheckBox box = (CheckBox) findViewById(R.id.cbBox);
Log.d(LOG_TAG, "make ListView clickable");
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
box.setChecked(true);
}
});
return box;
}
private void savebox(final boolean isChecked) {
SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("check", isChecked);
editor.commit();
Log.d(LOG_TAG, "checkbox is saved");
}
private boolean load() {
SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
return sharedPreferences.getBoolean("check", false);}
When I save it
onPause(){
savebox(checkboxer().isChecked());
}
Log indicates that it is saved.
Bun when I put
onResume(){
checkboxer().setChecked(load());
}
comes NullPointerException.
I think it is because nothing is checked and saved when activity starts running. Am I correct? How can I go around?
Thank you very much.
here we go
Logcat:
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime FATAL EXCEPTION: main
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime java.lang.RuntimeException: Unable to resume activity {example.CustomAdapter/example.CustomAdapter.ChildActivity}: java.lang.NullPointerException
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.os.Looper.loop(Looper.java:123)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:3683)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:507)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at dalvik.system.NativeStart.main(Native Method)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime Caused by: java.lang.NullPointerException
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at example.CustomAdapter.ChildActivity.onResume(ChildActivity.java:256)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.Activity.performResume(Activity.java:3832)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
08:18:37.830 1773 example.CustomAdapter ERROR AndroidRuntime ... 12 more
Sorry, I forgot. Could it be because in my adapter class I have View method with
CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setOnCheckedChangeListener(myCheckChangList);
cbBuy.setTag(position);
cbBuy.setChecked(p.box);
return view;`
And also
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
};
Sorry I am a new guy and probably don’t understand what kind of condradiction could be between checkbox declaration in adapter and in activity. If it is caused because of such contradiciton please explain.
Here is the exact coding for onResume and onPause
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "ChildActivity: onResume()");
DataSourceChild.openToWriteChild();
checkboxer();
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "ChildActivity: onPause()");
DataSourceChild.closeChild();
savebox(checkboxer().isChecked());
}
The whole code is too big. Let me provide you with onCreate first` public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.child);
Log.d(LOG_TAG, "ChildActivity: onCreate()");
child_datasource = new DataSourceChild(this);
DataSourceChild.openToWriteChild();
Intent intent = getIntent();
val_position = intent.getIntExtra("value_1", pos_1);
val_id = intent.getLongExtra("value_2", pos_2);
onSelectionMade();
}
public void onSelectionMade() {
if (val_position == val_id) {
loader(val_position);
}
}`
The loader contains checkboxer and looks as follow` public void loader(int val) {
item_values = child_datasource.readItem(val);
// определяем адаптер
boxAdapter = new BoxAdapter(this, item_values);
// настраиваем список
lvMain = (ListView) findViewById(R.id.lvMain);
// выставляем адаптер
lvMain.setAdapter(boxAdapter);
// регистратор контекстного меню
registerForContextMenu(lvMain);
// метод для работы с checkbox
checkboxer();
boxAdapter.notifyDataSetChanged();
}`
Now in custom BoxAdapter I have the following
` @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.childitem, parent, false);
}
Product p = getProduct(position);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setOnCheckedChangeListener(myCheckChangList);
cbBuy.setTag(position);
cbBuy.setChecked(p.box);
return view;
}`
Sorry for inconvenience caused. But I want to find out what is going on.
Your sample works with one click. Thank you very much. I have tried to update my adapter View method in the following way
` public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.childitem, parent, false);
}
Product p = getProduct(position);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setTag(position);
cbBuy.setChecked(mIsChecked[position]);
cbBuy.setOnCheckedChangeListener (new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mIsChecked[position] = isChecked;
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
});
return view;
}
`
and made change in onCreate
` public void loader(int val) {
item_values = child_datasource.readItem(val);
lvMain = (ListView) findViewById(R.id.lvMain);
boolean[] isChecked = new boolean[item_values.size()];
for (int i = 0; i < item_values.size(); i++) {
isChecked[i] = false;
}
boxAdapter = new BoxAdapter(this, item_values, isChecked);
lvMain.setAdapter(boxAdapter);
registerForContextMenu(lvMain);
boxAdapter.notifyDataSetChanged();
}`
it still can not save checks when I leave ChildActivity. I am sad that I can not apply your example and my knoweledge of Android is not enough for operating with View so easy as you do it. If you can further explain me how should I change View to get result I will appreciate it, if no then sorry for your time.
When the activity is started onResume() will be called. So in onResume() just give a check before calling setChecked function so that it should execute only when checkboxer() is not null to ensure it being executed only when the activity is resumed.
Sample activity with checkbox and listview
Sample adapter:
Layout with listview