2016-12-18 3 views
0

У меня есть активность, которая выглядит так: длина списка выглядит динамически и может измениться; enter image description hereКак сохранить состояния нескольких динамически генерируемых флажков в виде списка? (Android Java)

Теперь я определил и инициализировал флажки в зависимости от длины массива. Мне нужно сохранить состояния этих ящиков, когда пользователь нажимает «Сохранить». Как мне это достичь? Я написал следующий код, но я не получаю никакого ввода, т. Е. Даже если флажки инициализированы, я не думаю, что активность знает, какая заявка флажка для этого флажка действительна. Пожалуйста, помогите - спасибо!

cbs = new CheckBox[length]; 
for (int i=0;i<length;i++){ 
     cbs[i] = new CheckBox(ThisActivity.this); 
    } 
btnSave.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DoOnBtnClick(v); 
      } 
     }); 
    } 
    public void DoOnBtnClick (View v) { 
     for(int i = 0; i < cbs.length; i++){ 
      if(cbs[i].isChecked()){ 
       selectedCheckboxes.add(toInt(cbs[i].getTag())); 
       Log.e("GET TAG",Integer.toString(toInt(cbs[i].getTag()))); 
      } 
     } 
    } 
+0

Вы хотите сохранить данные состояния флажка, когда пользователь убивает приложение или активность закрыта ....? – rafsanahmad007

+0

Привет, да, я хочу. Спасибо ... пожалуйста, помогите. – Zac1

+0

Любая конкретная причина, почему вы создаете «CheckBox» динамически? Используйте класс модели для хранения состояния «CheckBox». Используйте «Sharedpreference», чтобы сохранить данные вашего класса модели при выходе из приложения. –

ответ

0

Если тег CheckBox «s должен представлять его индекс в списке, вы должны установить этот тег, когда вы инстанцировании их.

for (int i=0;i<length;i++){ 
    cbs[i] = new CheckBox(ThisActivity.this); 
    cbs[i].setTag(i); 
} 

Я бы не рекомендовал этот подход, если вы ожидаете, чтобы иметь переменное количество флажков из-за влияния на производительность. Вместо этого рассмотрите возможность использования RecyclerView с базовым списком объектов модели, представляющих состояние ваших флажков.

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

+0

У меня уже есть много кода в зависимости от моего списка. Насколько легко конвертировать в RecyclerView? Я не смог найти учебник по этому вопросу. – Zac1

+0

Также, как сохранить состояния всех флажков, когда пользователь выходит из приложения? – Zac1

+0

Обновление: по какой-то причине кнопка [link] (if (cbs [i] .isChecked()) {) никогда не вводится при нажатии кнопки. Почему это?! @ sean-amos – Zac1

1

вы можете использовать sharedPreferences для хранения и извлечения данных о состоянии флажка

инициализация переменных:

public static final String MyPREFERENCES = "MyPrefs"; 
SharedPreferences sharedPreferences; 

sharedPreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 

Теперь в вашем OnCreate() после того, как весь флажок инициализируется использовать setOnCheckedChangeListener

Теперь вы можете загружать данные из sharedpreferences, используя это:

public void Load_checklist() { 
    SharedPreferences shared = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 
    for(int i = 0; i < cbs.length; i++){ 
     if (shared.getString(Integer.toString(i), "").equals("1")) { 
      cbs[i].setChecked(true); 
     }else{ 
      cbs[i].setChecked(false); 
      } 
    } 
} 

, наконец, ваш OnCreate метод должен выглядеть следующим образом:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_name); 
     int array_length=jArray.length(); //checkbox size 
     //layout where you want to dynamically add checkboxes 
     LinearLayout linearLayout = (LinearLayout) findViewById(R.id.lyout); 
     Load_checklist(); 
     for(int c=0; c<jArray.length();c++){ 
     CheckBox chk=new CheckBox(this); 
     chk.setId(c++); 
     chk.setText("Click to add values"); 
     chk.setTextColor(Color.GRAY); 
     chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
      String s="x"+buttonView.getId(); 
      Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show(); 

      switch(buttonView.getId()){ 

       case 1: // do something on 1st checkbox 
        if (isChecked) { 
         SharedPreferences.Editor editor = sharedPreferences.edit(); 
         editor.putString(Integer.toString(c), "1"); 
         editor.commit(); 
        } else { 
         SharedPreferences.Editor editor = sharedPreferences.edit(); 
         editor.putString(Integer.toString(c), "0"); 
         editor.commit(); 
        } 
        break; 

       case 2: //do something on 2nd checkbox 
        break; 

      //And SO ON for all checkboes 
     } 
     } 
     }); 
     linearLayout.addView(chk); 
     } 
    } 

N.B: Если SETID (Int) не работает, то вы можете использовать SetTag (INT) вместо этого.

+0

@ Zac1 см. мой отредактированный ответ, я удаляю объявление переменной редактора сверху – rafsanahmad007

+0

Привет, спасибо. Я сделал это, но метод onCheckedChanged никогда не вызван. Я разместил там журнал и установил флажок **, но этот цикл никогда не вводится. Кроме того, можете ли вы, пожалуйста, помочь мне понять, как вызвать _Load_Checlist() _? – Zac1

+0

Похоже, что при выборе нескольких флажков в списке автоматически выбирается ... Я не понимаю. – Zac1