2013-08-19 3 views
1

Я проверяю всю тему с аналогичной проблемой, но я остаюсь в мертвой точке. У меня есть список со списком контактов, но когда я прокручиваю вниз и просматриваю список, не сохраняйте состояние моих выборов. Все флажки устанавливались на false. Когда я отлаживаю, я вижу, когда я прокручивал listview, мой onClickListener думал, что флажок подписан и сброшен. Я делаю все, другой массив с позицией булевым, и т.д. и т.д., и я до сих пор не знаю, что делать :(Я буду очень благодарен за любую помощь :)Android: Listview не сохраняет состояние флажка

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     readContacts(); 
     Contact_Database dbhandler = new Contact_Database(
       getApplicationContext(), null, null, 1); 
     numbers.addAll(dbhandler.getAllNumbers()); 
     System.out.println("onCreate"); 
     ListView lv = getListView(); 
     registerForContextMenu(lv); 
     lv.setTextFilterEnabled(true); 
     lv.clearChoices(); 
     MyAdapter adapter = (new MyAdapter(this, R.layout.contact_list_sms, contacts)); 
     adapter.notifyDataSetChanged(); 
     lv.setAdapter(adapter); 

    } 

    /** 
    * When I destroy intent i send request to database, faster! 
    */ 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     for (int i = 0; i < numbers.size(); ++i) 
      System.out.println("@@@@" + numbers.get(i)); 

     swap_contacts(); 

    } 

class MyAdapter extends ArrayAdapter<Contact> { 

     LayoutInflater inflat; 

     public MyAdapter(Context context, int textViewResourceId, 
       ArrayList<Contact> objects) { 
      super(context, textViewResourceId, objects); 
      inflat = LayoutInflater.from(context); 
      System.out.println("LOLLLLL"); 
      notifyDataSetChanged(); 

     } 

     @Override 
     public int getItemViewType(int position) { 
      return (position == this.getCount() - 1) ? 1 : 0; 
     } 

     @Override 
     public int getViewTypeCount() { 
      return 2; 
     } 

     // if that contact exist in database? numbers, in onCreate method 
     // i init this with saved position from databse 
     private boolean exist(String x) { 
      for (int i = 0; i < numbers.size(); i++) 
       if (numbers.get(i).compareTo(x) == 0) 
        return true; 
      return false; 
     } 

     @SuppressLint("NewApi") 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      System.out.println("ROWS !!! ->" + numbers.size()); 
      ViewHolder holder = null; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = inflat.inflate(R.layout.contact_row, null); 
       holder.textView1 = (TextView) convertView 
         .findViewById(R.id.name); 
       holder.textView2 = (TextView) convertView 
         .findViewById(R.id.number); 
       holder.on_off = (CheckBox) convertView 
         .findViewById(R.id.enable); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      Contact it = contacts.get(position); 
      Log.v("XXX", holder.toString()); 
      if (it != null) { 
       holder.textView1.setText(contacts.get(position).name); 
       holder.textView2.setText(contacts.get(position).phone); 
       // update state of checbox from database 
       if (exist(contacts.get(position).phone)) 
        holder.on_off.setChecked(true); 
       else 
        holder.on_off.setChecked(false); 
      } 

      final int element_position = position; 

      holder.on_off 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
         // update list when we click on it 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          String nr_telefonu = contacts.get(element_position).phone; 
          if (isChecked) { 
           numbers.add(nr_telefonu); 
          } else { 
           numbers.remove(nr_telefonu); 
          } 
         } 
        }); 
      return convertView; 
     } 


     @Override 
     public Contact getItem(int position) { 
      return contacts.get(position); 
     } 

     private class ViewHolder { 
      TextView textView1, textView2; 
      CheckBox on_off; 

      public String toString() { 
       return "-"; 
      } 
     } 
    } 

ответ

2

Список не сохраняет его состояние во время прокрутки, потому что каждый раз, когда создается новый объект для элемента строки. Поэтому вам нужно явно сохранить состояние CheckBox с помощью класса Pojo (Setter и getter).

в методе getView() вам нужно проверить значение для каждого флажка.

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
//////////////////// 

и setOnCheckedChangeListener вам нужно сохранить состояние флажка

    holder.on_off 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
         // update list when we click on it 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
         // need to save the state 

для получения более подробной информации, пожалуйста, смотрите на это ниже блог

http://amitandroid.blogspot.in/2013/03/android-listview-with-checkbox-and.html

вы можете изменить его в соответствии с вашими требование.

+0

Учебник в этом блоге очень полезно! – pkruk

+1

@neptyd, если он действительно решает вашу проблему, plz оценил мой ответ. –

0

Спасибо за ответ :) Я создаю массив stan с состоянием для каждой кнопки флажка. Завтра я попробую перестроить весь свой класс, как список в блоге, возможно, это поможет мне.

Но когда я это сделать: сохранить состояние:

holder.on_off 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
         // update list when we click on it 
         // this.setChecked(stan[position]); 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          String nr_telefonu = p.get(element_position).phone; 
          buttonView.setChecked(stan[element_position]); 

          stan[element_position] = isChecked; 
         } 
        }); 

Обновить состояние кнопки

if (it != null) { 
       holder.textView1.setText(contacts.get(position).name); 
       holder.textView2.setText(contacts.get(position).phone); 
       // update state of checbox from database 

        holder.on_off.setChecked(stan[position]); 
      } 

Я до сих пор стоят в мертвой точке, ничего не изменилось

0

Я отправил решение этой проблемы, ниже которой я провел много времени, и это работает для меня!

public class RowAdapter extends ArrayAdapter<Rows> { 
 

 
\t Context context; 
 
    int layoutResourceId;  
 
    ArrayList<Rows> data; 
 
    boolean[] checkBoxState; 
 
    RowHolder rowHolder; 
 
\t 
 
\t 
 
\t public RowAdapter(Context context, int layoutResourceId, ArrayList<Rows> data) { 
 
\t \t super(context, layoutResourceId, data); 
 
\t \t 
 
\t \t this.layoutResourceId = layoutResourceId; 
 
\t \t this.context = context; 
 
\t \t this.data = data; 
 
\t \t 
 
\t \t checkBoxState = new boolean[data.size()]; 
 
\t } 
 
\t 
 

 
\t @Override 
 
    public View getView(final int position, View convertView, ViewGroup parent) { 
 
     View row = convertView; 
 
     RowHolder holder = null; 
 
     
 
     
 
     if(row == null) 
 
     { 
 
      \t 
 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
 
      row = inflater.inflate(layoutResourceId, parent, false); 
 
      holder = new RowHolder(); 
 

 
holder.textView1 = (TextView)row.findViewById(R.id.textView1); 
 
      holder.textView2 = (TextView)row.findViewById(R.id.textView2); 
 
      holder.textView3 = (TextView)row.findViewById(R.id.textView3); 
 
      holder.textView4 = (TextView)row.findViewById(R.id.textView4); 
 
      holder.checkBox=(CheckBox) row.findViewById(R.id.checkBox1); 
 
      
 
      
 
      row.setTag(holder); 
 
     } 
 
     else{ 
 
     
 
     \t holder = (RowHolder)row.getTag(); 
 
      } 
 
    
 
     
 
     Rows rows = data.get(position); 
 
     holder.textView1.setText(rows.address); 
 
     holder.textView2.setText(rows.tenancy); 
 
     holder.textView3.setText(rows.location); 
 
     holder.textView4.setText(rows.name); 
 
     
 
     holder.checkBox.setChecked(checkBoxState[position]); 
 

 
holder.checkBox.setOnClickListener(new View.OnClickListener() { 
 
      
 
     \t public void onClick(View v) { 
 
     \t  if(((CheckBox)v).isChecked()) 
 
     \t  checkBoxState[position]=true; 
 
     \t  else 
 
     \t  checkBoxState[position]=false; 
 
     \t  
 
     \t  } 
 
     \t }); 
 
     
 
     
 
     return row; 
 
    } 
 
    
 
    static class RowHolder 
 
    { 
 
    \t TextView textView1; 
 
     TextView textView2; 
 
     TextView textView3; 
 
     TextView textView4; 
 
     CheckBox checkBox; 
 
    } 
 
    
 
    
 

 
    
 
    
 
} 
 
    

Смежные вопросы