2

共有設定を使用して、次にアプリを開いたときにチェックボックスの状態を保存するにはどうすればよいですか? 私はカスタムアダプターを使用しているので、その中に配置する必要があると推測していますが、よくわかりません.

私のアダプター:

public class MobileArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;
private ArrayList<Boolean> itemChecked = new ArrayList<Boolean>();


    public MobileArrayAdapter(Context context, String[] values) {
        super(context, R.layout.list_adapter, values);
        this.context = context;
        this.values = values;


        for (int i = 0; i < this.getCount(); i++) {
            itemChecked.add(i, false);
        }
    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.list_adapter,
                    parent, false);
        }
           // in your code you search for the CheckBox with the id checkBox1 2 times so I assumed that you are referring to the same view.
        CheckBox cBox = (CheckBox) rowView.findViewById(R.id.checkBox1);
        cBox.setTextColor(0xFFFFFFFF);
        cBox.setText(values[position]);       
        cBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    itemChecked.set(position, true);
                    // do some operations here
                } else {
                    itemChecked.set(position, false);
                    // do some operations here
                }
            }
        });
        cBox.setChecked(itemChecked.get(position));
        return rowView;
    }

}

私の主な活動:

public class TheKevinAndEricaBoxActivity extends Activity {
/** Called when the activity is first created. */
private String[] myString;
private String list;
private String[] myString2;
private String list2;
private static final Random rgenerator = new Random();
private static final Random rgenerator2 = new Random();
MediaPlayer mp;
final Context mContext = this;
final Context context = this;
private Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Resources res = getResources();
    addListenerOnButton();




    myString = res.getStringArray(R.array.myArray);

    list = myString[rgenerator.nextInt(myString.length)];

    myString2 = res.getStringArray(R.array.myArray2);

    list2 = myString2[rgenerator.nextInt(myString2.length)];
}



    public void addListenerOnButton() {

        final Context context2 = this;

        ImageButton ibg = (ImageButton) findViewById(R.id.buttongallery);

        ibg.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Intent intent = new Intent(context2, App2Activity.class);
                startActivityForResult(intent, 0);   

            }

        });


    ImageButton ib = (ImageButton) findViewById(R.id.imagebutton1);
    ib.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View erica) {
            AlertDialog.Builder b = new AlertDialog.Builder(
                    TheKevinAndEricaBoxActivity.this);
            b.setMessage(myString[rgenerator.nextInt(myString.length)]);
            b.setTitle(R.string.title1);
            b.setIcon(R.drawable.menuiconerica);
            b.setPositiveButton("Back",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            dialog.cancel();
                        }
                    });
            Dialog d = b.create();
            d.show();
        }
    });

    ImageButton ib2 = (ImageButton) findViewById(R.id.imagebutton2);
    ib2.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View kevin) {
            AlertDialog.Builder b = new AlertDialog.Builder(
                    TheKevinAndEricaBoxActivity.this);
            b.setMessage(myString2[rgenerator2.nextInt(myString2.length)]);
            b.setTitle(R.string.title2);
            b.setIcon(R.drawable.menuiconkevin);
            b.setPositiveButton("Back",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            dialog.cancel();
                        }
                    });
            Dialog d = b.create();
            d.show();

        }
    });


    ImageButton Ib3 = (ImageButton) findViewById(R.id.imagebutton3);
    Ib3.setOnClickListener(new View.OnClickListener() {
        public void onClick(View lemonclick) {
            mp = MediaPlayer.create(getApplicationContext(),R.raw.lemonspeech);
            mp.start();


        }
    });
    button = (Button) findViewById(R.id.button01);

    // add button listener
    button.setOnClickListener(new OnClickListener() {

      public void onClick(View arg0) {

        // custom dialog
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.list);
        dialog.setTitle("The List");


        // set the custom dialog components - text, image and button
        //TextView text = (TextView) dialog.findViewById(R.id.TextView01);
        //text.setText("Did you not read the button? :P i'm not finshed on this yet XD");


        ListView listView = (ListView) findViewById(R.id.myList);
        String[] values = new String[] { "value1", "value2", };


        MobileArrayAdapter mAdapter = new MobileArrayAdapter(getBaseContext(), values);
        ListView mListView = (ListView) dialog.findViewById(R.id.myList);
        mListView.setAdapter(mAdapter);


        Button dialogButton = (Button) dialog.findViewById(R.id.Button01);
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
      }

    });
    }
}
4

3 に答える 3

4

OnCLickListenerあなたのためButtonにこれを追加してください:

//...
// custom dialog
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.list);
dialog.setTitle("The List");

prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefsEditor = prefs.edit();
String currentlyStored = prefs.getString("checked_list", null);
int[] savedStatus = null;
if (currentlyStored != null) {
    String[] tmp = currentlyStored.split(",");
    savedStatus = new int[tmp.length];
    for (int i = 0; i < tmp.length; i++) {
        savedStatus[i] = Integer.parseInt(tmp[i]);
    }
}
adapter = new MobileArrayAdapter(this, soundnames, savedStatus);
ListView mListView = (ListView) dialog.findViewById(R.id.myList);
mListView.setAdapter(mAdapter);
//...

どこ:

private SharedPreferences prefs;
private SharedPreferences.Editor prefsEditor;
private MobileArrayAdapter adapter;

はクラス内ListViewのフィールドです(adapterフィールドには、リストに設定したアダプタオブジェクトが保持されます)。

カスタムアダプタのコンストラクタを次のように変更します。

public MobileArrayAdapter(Context context, String[] values,
                int[] oldStatus) {
            super(context, R.layout.adapters_simpleplay_row, values);
            this.context = context;
            this.values = values;

            // make every CheckBox unchecked and then loop through oldStatus(if
            // not null)
            for (int i = 0; i < this.getCount(); i++) {
                itemChecked.add(i, false);
            }
            if (oldStatus != null) {
                for (int j = 0; j < oldStatus.length; j++) {
                    itemChecked.set(oldStatus[j], true);
                }
            }
        }

また、カスタムアダプタに次のメソッドを追加しますMobileArrayAdapter

public ArrayList<Boolean> getCheckedStatus() {
            return itemChecked;
}

dialogButtonこれを追加するためのリスナーの最後に:

dialogButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                            String toStore = "";
            ArrayList<Boolean> status = adapter.getCheckedStatus();
            for (int i = 0; i < status.size(); i++) {
                if (status.get(i)) {
                    toStore += i + ",";
                }
            }
            prefsEditor.putString("checked_list", toStore.equals("") ? null
                    : toStore.substring(0, toStore.length() - 1));
            prefsEditor.commit();
                dialog.dismiss();
            }
        });
于 2012-04-23T18:36:15.690 に答える
1

選択を保存するには、saveSelections メソッドを作成してonPause()andで呼び出すonDestroy()か、Button を作成して同じことを行います... 編集:

MultipleChoice を使用しているのでListView、onCreate でこれを行うことができると思います...

listView = (ListView) findViewById(R.id.list);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice,
                android.R.id.text1, names));

onCreate() の外でこれら 3 つのメソッドを作成します。

private void LoadSelections() {
        SharedPreferences sp = getPreferences(MODE_PRIVATE);
        if (sp.contains(LOAD_LIST)) {
            String savedItems = sp.getString(LOAD_LIST, "");
            this.selectedItems.addAll(Arrays.asList(savedItems.split(",")));
            int count = this.listView.getAdapter().getCount();
            for (int i = 0; i < count; i++) {
                String currentItem = (String) listView.getAdapter().getItem(i);
                if (this.selectedItems.contains(currentItem)) {
                    this.listView.setItemChecked(i, true);
                }

            }
        }
    }

    public void SaveSelections() {
        SharedPreferences sp = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor prefEditor = sp.edit();
        String savedItems = getSavedItems();
        prefEditor.putString(LOAD_LIST, savedItems);
        prefEditor.commit();
    }

    private String getSavedItems() {
        String savedItems = "";
        int count = listView.getAdapter().getCount();
        for (int i = 0; i < count; i++) {
            if (listView.isItemChecked(i)) {
                if (savedItems.length() > 0) {
                    savedItems += "," + listView.getItemAtPosition(i);
                } else {
                    savedItems += listView.getItemAtPosition(i);
                }
            }
        }
        return savedItems;
    }

次に、onPause() で次のようにします。

@Override
protected void onPause() {
    SaveSelections();
    super.onPause();
}

最後に onCreate でこれを呼び出します..

LoadSelections();
于 2012-04-23T17:54:56.550 に答える
0

0 と 1 の文字列を作成し、共有設定を使用して保存できます。使用しているチェックボックスの数 (またはビューの数) が string の長さになります。それに応じて保存します。

例えば:

String s[]="0000000000";
for (i=0;i<s.length();i++)
if (checkboxAtLocation(i)==true)    //checkboxAtLocation() will return a boolean variable on basis of its checked or not
    s[i]=1;

この文字列を保存します。アクティビティを再開するときに、この文字列を使用してチェックボックスを設定します。

これは実装が少し複雑ですが、私の知る限り最も効率的な方法です。それがあなたの疑問を解決することを願っています。

于 2012-04-23T18:12:14.283 に答える