Кнопка прокрутки в виде списка теряет свое состояние при прокрутке экрана в Android - PullRequest
2 голосов
/ 17 января 2011

У меня есть представление списка, в котором все данные выбираются из адаптера списка. Каждый элемент в виде списка содержит текстовое представление и кнопку переключения. Но возникает проблема, когда я прокручиваю список. измененное состояние переключаемых кнопок меняется, т. е. если я выбрал переключающую кнопку с индексом 4, то после прокрутки обнаруживается, что выбрана любая случайная кнопка, кроме четвертой.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2012

если у вас все еще нет решения, попробуйте этот метод getview. // switchState [] - логический массив.

public View getView(int position, View convertView, ViewGroup parent) {
           ViewHolder holder = new ViewHolder();
         // mSwitchButton = (ToggleButton) findViewById(R.id.switchButton);
        if(convertView == null) {
            convertView = mInflator.inflate(R.layout.settings_item_cell, parent, false);
            holder.categoryName =
                    (TextView) convertView.findViewById(R.id.categoryType);
            convertView.setTag(holder);
            holder.switchButton  = (ToggleButton) convertView.findViewById(R.id.switchButton); 
        }
        else {
            holder = (ViewHolder) convertView.getTag();


        }

            holder.switchButton.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    int index =  (Integer) v.getTag();
                    Log.v("tag of switch============",""+index);
                    if(((ToggleButton) v).isChecked()) {
                        switchState[index] = true; 
                        ((ToggleButton) v).setButtonDrawable(R.drawable.item_selected);

                    }
                    else {
                        ((ToggleButton) v).setButtonDrawable(R.drawable.item_deselected);
                        switchState[index] =false; 
                    }
                    isToggleButtonClicked = true;

                }
            });  
            if(switchState[position])   
                holder.switchButton.setButtonDrawable(R.drawable.item_selected);
            else
                holder.switchButton.setButtonDrawable(R.drawable.item_deselected);

        holder.categoryName.setText(categories[position]);
        holder.switchButton.setTag(new Integer(position));

        return convertView;

    }
2 голосов
/ 17 января 2011

Поскольку строки перерабатываются, вам необходимо поддерживать собственное состояние, сохраняя и восстанавливая свой статус ToggleButton по мере его изменения. Вот пример проекта , демонстрирующий использование RatingBar в строках; тот же базовый процесс должен выполняться для ToggleButton.

0 голосов
/ 27 февраля 2014

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

private class MyListAdapter extends ArrayAdapter<Product> {
     boolean [] switchState= new boolean[100] ;
    public MyListAdapter() {
        super(ProductSelectActivity.this, R.layout.item_view, myProducts);
    }

public View getView( int position, View convertView, ViewGroup parent) {
        // Make sure we have a view to work with (may have been given null)

        ViewHolder holder;

        View itemView = convertView;
        if (itemView == null) {
            itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
            View row= itemView;
            holder= new ViewHolder(row);
            itemView.setTag(holder);
            holder.switchButton  = (ToggleButton) itemView.findViewById(R.id.favorite_button); 

        }
        else
        {
            holder = (ViewHolder) itemView.getTag();

        }


        holder.switchButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                int index =  (Integer) v.getTag();

                if(((ToggleButton) v).isChecked()) {
                    switchState[index] = true; 
                    ((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_on);

                }
                else {
                    ((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_off);
                    switchState[index] =false; 
                }

            }
        });
        if(switchState[position])   
            holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_on);

        else
            holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_off);

    //holder.categoryName.setText(categories[position]);
    holder.switchButton.setTag(Integer.valueOf(position));

ViewHolder.class

public class ViewHolder {
ToggleButton switchButton=null;

  ViewHolder(View base) {
    this.switchButton=(ToggleButton)base.findViewById(R.id.favorite_button);
  }

}

Этот код компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...