1

次のコードを実装しようとしています。

 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を操作するには十分ではありません. 結果を得るためにビューを変更する方法をさらに説明していただければ幸いです。そうでない場合は、お時間をいただき申し訳ありません。

4

1 に答える 1

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");
}
  }

リストビューでレイアウト

<?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>
于 2012-10-26T08:54:59.510 に答える