2016-02-10 8 views
0

Я создаю приложение для Android, и я хотел бы активировать только один переключатель в режиме on-mode в любое время в ListView. Я использую метод onCheckedChanged. Как я могу это сделать?Как я могу включить один переключатель в ListView многих переключателей?

public ListAdapter2(Context context, ArrayList<String> resource, Boolean[] checkedStatus) { 
    super(context,R.layout.toggle_button_row,resource); 
    // TODO Auto-generated constructor stub 
    this.context = context; 
    goalList=new ArrayList<String>(); 
    this.goalList =resource; 
    this.checkedStatus=checkedStatus; 

} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
    convertView = inflater.inflate(R.layout.toggle_button_row, parent, false); 
    v1=convertView; 
    TextView name = (TextView) v1.findViewById(R.id.textview1); 
    name.setText(goalList.get(position).toString()); 
    sw= (Switch) v1.findViewById(R.id.switch1); 
    sw.setTag(position); 
    sw.setOnCheckedChangeListener(ListAdapter2.this); 
    sw.setChecked(checkedStatus[position]); 

    return convertView; 
} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    Integer index = (Integer) buttonView.getTag(); 
    checkedStatus[index] = isChecked; 
    String key = index.toString(); 

    //save the data for the status 
    SharedPreferences sharedPreferences = getContext().getSharedPreferences("status", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean(key, isChecked); 
    editor.putBoolean("MyGoal", isChecked); 
    editor.putString("MyGoal1", goalList.get(index).toString().trim()); 
    editor.apply(); 
} 

Я добавил больше своего кода. Что я хочу сделать, так это в этом конкретном ListView, когда я включил, например, первый, который я хочу сохранить его состояние, и я достиг этого, используя sharedPreferences, но я не хочу иметь несколько включений. Поэтому, когда я активирую второй, я хочу, чтобы первый отключился. То же самое относится ко всем из них, когда кто-то активен, остальные отключены.

public void display(View v) { 
    //The database is open! 
    ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME); 
    database = dbOpenHelper.openDataBase(); 
    //initialize 
    goalList = new ArrayList<String>(); 
    //put cursor 
    Cursor cursor = database.rawQuery("select * from tbl_WG", null); 
    cursor.moveToFirst(); 
    if(!cursor.isAfterLast()) { 
     do { 
      String name=cursor.getString(cursor.getColumnIndex("name")); 
      Integer steps=Integer.parseInt(cursor.getString(1)); 

      goalList.add("Name: "+name+" || Steps: "+steps); 


     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
    //size of the status list; 
    status= new boolean[goalList.size()]; 

    //check state 
    SharedPreferences sharedPreferences = getSharedPreferences("status", MODE_PRIVATE); 
    checkedStatus = new Boolean[goalList.size()]; 
    for (int index = 0; index < checkedStatus.length; index++) 
     checkedStatus[index] = sharedPreferences.getBoolean(Integer.toString(index), false); 


    //create an ArrayAdaptar from the String Array 
    ListAdapter2 adapter = new ListAdapter2(this, goalList, checkedStatus); 
    // Assign adapter to ListView 
    mainListView.setAdapter(adapter); 

} 
+0

ли вы поддерживать массив всех этих коммутаторов в любом месте? –

+0

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

+0

обновил мой пост, спасибо за ваше время – BillUser88

ответ

0

Я думаю, что вы почти у цели.

@Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     // First turn off the switch of any other item that may be on 
     Arrays.fill(checkedStatus, false); 

     Integer index = (Integer) buttonView.getTag(); 
     checkedStatus[index] = isChecked; 
     notifyDataSetChanged(); // don't forget to tell ListView that data is updated 

     //save the data for the status 
     String key = index.toString(); 
     SharedPreferences sharedPreferences = getContext().getSharedPreferences("status", Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 

     /* 
     * I don't think this code: 
     * 
     *  editor.putBoolean(key, isChecked); 
     * 
     * is a really good idea, because you have to make sure 
     * you "uncheck" any keys that were previously checked. 
     * 
     * This might be better: 
     */ 
     if (isChecked) { 
      editor.putInt("last_index", index); 
     } else { 
      editor.remove("last_index"); // nothing's checked, so erase pref 
     } 

     editor.putBoolean("MyGoal", isChecked); 

     // not sure this makes sense if isChecked == false, you may want to rethink the preferences 
     editor.putString("MyGoal1", goalList.get(index).toString().trim()); 
     editor.apply(); 
    } 

Кроме того, в методе getView, вы должны сделать что-то вроде этого:

 sw.setOnCheckedChangeListener(null); 
     sw.setChecked(checkedStatus[position]); 
     sw.setOnCheckedChangeListener(ListAdapter2.this); 

Это предотвратит любые переработанные слушателей от стрельбы, когда вы устанавливаете проверенное состояние переключателя.


С предпочтении экономии кода выше, вот как вы можете восстановить проверенное состояние:

//check state 
    SharedPreferences sharedPreferences = getSharedPreferences("status", MODE_PRIVATE); 
    checkedStatus = new Boolean[goalList.size()]; 
    int index = sharedPreferences.getInt("last_index", -1); 
    if (index != -1) { 
     checkedStatus[index] = true; 
    } 
+0

Большое спасибо за ваш код, вы действительно помогли мне понять некоторые вещи. Теперь с этим кодом мне удалось проверить один и снять отметку с остальными, что идеально, но теперь я потерял состояние. Быстрое исправление? а также почему нет? sw.setOnCheckedChangeListener (null) – BillUser88

+0

Не уверен, что я понимаю, что вы подразумеваете под «потерянным состоянием». Если вы используете настройки для сохранения состояния всего списка, возможно, лучший способ. Что касается null, просто вызов 'setChecked' будет запускать' OnCheckedChangeListener', поэтому, установив его в null, вы убедитесь, что он запускается только тогда, когда пользователь проверяет/отменяет его. Помните, что эти представления могут быть переработаны, так что представление может прийти к уже установленному слушателю; вот почему вам нужно сначала отменить его. –

+0

Я имею в виду, что когда я снова вернусь к активности, переключатель не включен, а выключен, поэтому он потерял свое состояние. это Arrays.fill (checkedStatus, false); вызывая проблему? что вы имеете в виду, есть лучший способ? – BillUser88