Переключить кнопку сброса при просмотре списка прокрутки

У меня есть код, в котором пользователю отображается список элементов. Рядом с элементами списка находится кнопка-переключатель. Поэтому, когда пользователь включает переключатель, срабатывает сигнал тревоги. Теперь проблема в том, что когда я устанавливаю кнопку переключения 1-го элемента в списке, он исчезает и / или сбрасывается, когда я прокручиваю до конца списка и снова возвращаюсь к первому элементу. Я полностью сбит с толку, установив это, чтобы оставаться там выбранным. Попросите кого-нибудь на этом форуме помочь мне.

Мой класс CSVAdapter. Прилагаю сюда.

public class CSVAdapter extends ArrayAdapter<clock>{
    Context ctx;
    String line;
    int position=-1;
    ViewHolder myviewholder;
    mrvtoparanur mp;
    clock clk;
    HashMap<Integer, Boolean> btnstate=new HashMap<Integer,Boolean>();
    public CSVAdapter(Context context,int textViewResourceId, ArrayAdapter<clock> clk)
    {
        super (context,R.layout.checkbox,textViewResourceId);   
        this.ctx = context;
        loadArrayFromFile();
    }

    static class ViewHolder
    {

        TextView text;
        ToggleButton tb;

    }

    @Override
public View getView(final int pos,View convertView,final ViewGroup parent){
         View row=convertView;

        if(row==null){
            LayoutInflater vi=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            row=vi.inflate(R.layout.checkbox, parent,false);
            myviewholder.text=(TextView)convertView.findViewById(R.id.code);
            myviewholder.tb=(ToggleButton)convertView.findViewById(R.id.checkBox1);
            myviewholder=new ViewHolder();
            position=pos;
            row.setTag(myviewholder);
            //Log.d("KEY", "VIEW CREATED NEWLY");
            //myviewholder.tb.setChecked(btnstate.get(pos));


        }
        else
        {
        myviewholder=(ViewHolder)convertView.getTag();
        Log.d("KEY", "VIEW RECYCLED");  
        btnstate.size();
        btnstate.put(position, true);
        }


        myviewholder.text.setText(getItem(pos).getTime());
        myviewholder.tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                //myviewholder.tb.setChecked(btnstate.get(position));
                btnstate.putAll(btnstate);
                btnstate.put(position, true);
            }
        });


        return row;
}







private void loadArrayFromFile(){
    try
    {
        InputStream is=ctx.getAssets().open("mrvtoparanur.csv");
        BufferedReader reader=new BufferedReader(new InputStreamReader(is));        
        //Read each line
        while((line = reader.readLine())!=null){
            clock cur = new clock();
            cur.setTime(line);
            this.add(cur);
        }

     } 
         catch (IOException e) {
          e.printStackTrace();
        }

}
}

person Krish3090    schedule 30.05.2014    source источник
comment
возможное дублирование состояния флажка ListView Viewholder   -  person josephus    schedule 30.05.2014


Ответы (1)


Есть разные способы добиться этого. Один из способов - создать переменную-член ArrayList. Что-то вроде

private HashMap<Integer, Boolean> btnState = new HashMap<Integer, Boolean>();

затем, когда состояние кнопки истинно, просто используем это position в getView() и добавляем его туда как true. Затем в вашем getView() проверяйте каждый раз, является ли элемент в этой позиции истинным или ложным, и устанавливайте состояние с этим значением.

public View getView(int pos,View convertView,final ViewGroup parent){

  ...
  myviewholder.tb.setChecked(btnState.get(position);  

И в вашем onCheckChangedListener, очевидно, вы захотите добавить значение в свой список

btnState.put(position, isChecked); // is checked is whatever value you use in your listener

Вы также можете использовать SparseBooleanArray или ArrayList, но я считаю, что HashMap лучше всего подходит для моего потребности по какой-либо причине.

person codeMagic    schedule 30.05.2014
comment
Спасибо, CodeMagic! Попробую это и вернусь к вам - person Krish3090; 30.05.2014
comment
Братан, я приближаюсь к силе. Исключение нулевого указателя в трассировке стека. Кстати, где мне поместить этот ваш код myviewholder.tb.setChecked (btnState.get (position)); Внутри метода getView или внутри if (convertView == null) ??? Смущает этот. Нужна ваша помощь. - person Krish3090; 30.05.2014
comment
Какая линия дает тебе NPE, братан? У вас есть onCheckChangedListener()? Если так, то есть. Если нет, то внутри вашего getView(). После вашего if/else - person codeMagic; 30.05.2014
comment
если я помещаю этот код в onchecedchangelistener (), он дает мне принудительное закрытие во время события проверки кнопки. Иначе, если я помещаю код после операторов if / else, это дает мне силу закрыть при рисовании самого списка. В любом случае, это не сработало :( .. Если хочешь, я могу опубликовать полный код .. А ты? - person Krish3090; 30.05.2014
comment
Вы должны инициализировать свою кнопку, как и свой TextView. Я предполагал, что ты знал это - person codeMagic; 31.05.2014
comment
magic: Мне жаль .. Я новичок в разработке Android. как это сделать и где инициализировать? если вы можете предоставить код, мне будет очень приятно его понять. - person Krish3090; 31.05.2014
comment
Где инициализировать myviewholder.text? Сделайте то же самое со своей кнопкой - person codeMagic; 31.05.2014
comment
да, я сделал это .. Если вы видите мой класс ViewHolder () ... Я инициализировал и мою кнопку переключения, и текстовое представление .. - person Krish3090; 31.05.2014
comment
Нет, их нужно инициализировать в getView() - person codeMagic; 31.05.2014
comment
я инициализировал их в getView () .. теперь приближаю силу :( - person Krish3090; 31.05.2014
comment
для вашего ясного понимания .. выложу полный код ... обновлю их в самом вопросе. Пожалуйста, прочтите их и дайте мне знать, где я сделал ошибку (ы)? - person Krish3090; 31.05.2014
comment
И какое исключение logcat вы получаете сейчас? - person codeMagic; 31.05.2014
comment
теперь я заставил код как-то работать ... но дело в том ... Я проверяю первый элемент в списке, прокручиваю вниз и возвращаюсь к первому элементу не отмечен, и случайным образом проверяются многие другие элементы ... - person Krish3090; 31.05.2014