次のコードを実装しようとしています。
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); 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);
}
}`
ローダーにはチェックボックスが含まれており、次のように見えます` 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;
}`
ご迷惑をお掛けして申し訳ございません。しかし、私は何が起こっているのか知りたいです。
サンプルはワンクリックで機能します。どうもありがとうございました。次の方法でアダプターの 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を操作するには十分ではありません. 結果を得るためにビューを変更する方法をさらに説明していただければ幸いです。そうでない場合は、お時間をいただき申し訳ありません。