我正在尝试实现以下代码:
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
。
我认为这是因为在活动开始运行时没有检查和保存任何内容。我对么?我该怎么走?
非常感谢你。 我们走了
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
对不起,我忘了。可能是因为在我的适配器类中我有
的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 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);
}
}`
加载器包含复选框,看起来如下`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操作这么简单。如果你能进一步解释我如何更改View以获得结果我会很感激,如果没有那么抱歉你的时间。
答案 0 :(得分:1)
当活动开始时,将调用onResume()。所以在onResume()中只需在调用setChecked函数之前进行检查,这样它只应在checkboxer()不为null时执行,以确保仅在恢复活动时执行。
onResume(){
if(checkboxer() != null)
checkboxer().setChecked(load());
}
带有复选框和列表视图的示例活动
package com.example.checkdoubltap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class CheckLayoutParams extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.lin);
ListView list = (ListView) findViewById(R.id.listview);
boolean[] isChecked = new boolean[countryStrings.length];
for(int i=0;i<countryStrings.length; i++){
isChecked[i] = false;
}
CheckBoxAdapter adapter = new CheckBoxAdapter(CheckLayoutParams.this, countryStrings, isChecked);
list.setAdapter(adapter);
}
private String[] countryStrings = { "Afghanistan", "Albania",
"Algeria", "Andorra", "Angola", "Anguilla", "Antigua and Barbuda",
"Argentina", "Armenia", "Aruba", "Ascension Island", "Australia",
"Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh",
"Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda",
"Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana",
};
}
示例适配器:
package com.example.checkdoubltap;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class CheckBoxAdapter extends BaseAdapter {
private Context mContext;
private String[] mCountries;
private boolean[] mIsChecked;
public CheckBoxAdapter(Context context, String[] countryStrings, boolean[] isChecked) {
mContext = context;
mCountries = countryStrings;
mIsChecked = isChecked;
}
@Override
public int getCount() {
if(mCountries != null)
return mCountries.length;
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
CheckBox view = new CheckBox(mContext);
view.setChecked(load(position));
// view.setChecked(mIsChecked[position]);
view.setText(mCountries[position]);
view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d("Check","Changing position to"+position+" "+isChecked);
mIsChecked[position] = isChecked;
savebox(position,isChecked);
}
});
return view;
}
private boolean load(int position) {
SharedPreferences sharedPreferences = ((Activity) mContext).getPreferences(Context.MODE_PRIVATE);
return sharedPreferences.getBoolean(""+position, false);
}
private void savebox(int position, final boolean isChecked) {
SharedPreferences sharedPreferences = ((Activity) mContext).getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(""+position, isChecked);
editor.commit();
Log.d(TAG, "checkbox is saved");
}
}
使用listview进行布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/listview"
>
</ListView>
</LinearLayout>