我正在尝试实现以下代码:
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);}
当我保存它时
onPause(){
savebox(checkboxer().isChecked());
}
日志表示已保存。包子当我放
onResume(){
checkboxer().setChecked(load());
}
来了NullPointerException
。
我认为这是因为活动开始运行时没有检查和保存任何内容。我对么?我怎么能四处走动?
非常感谢你。开始了
日志猫:
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
对不起我忘记了。可能是因为在我的适配器类中我有 View 方法
CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setOnCheckedChangeListener(myCheckChangList);
cbBuy.setTag(position);
cbBuy.setChecked(p.box);
return view;`
并且
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
};
对不起,我是一个新人,可能不明白适配器中的复选框声明和活动中可能存在什么样的矛盾。如果是由于这种矛盾引起的,请解释。
这是和的确切onResume
编码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());
}
整个代码太大了。让我先为您提供 onCreate ` public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 设置内容视图(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);
}
}`
加载器包含复选框,如下所示` 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();
}`
现在在自定义 BoxAdapter 我有以下
` @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;
}`
对造成的不便深表歉意。但我想知道发生了什么。
您的示例一键即可工作。非常感谢你。我尝试通过以下方式更新我的适配器视图方法
` 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;
}
`
并在 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();
}`
当我离开 ChildActivity 时,它仍然无法保存支票。我很遗憾我无法应用您的示例,而且我对 Android 的了解还不足以像您那样轻松地使用 View 进行操作。如果您能进一步解释我应该如何更改视图以获得结果,我将不胜感激,如果没有,那么对不起您的时间。