2013-08-19 105 views
1

我檢查所有類似問題的主題,但我仍然停留在死點。我有一個列表視圖與聯繫人列表,但是當我向下滾動並向上滾動列表視圖不保存我的選擇狀態。所有複選框都設置爲false。當我調試我看到,當我滾動列表視圖時,我的onClickListener認爲複選框簽名並重置此。我做的一切,其他的陣列位置布爾,等等等等,我仍然不知道該怎麼辦:(我會爲任何幫助:)Android:列表視圖不保存複選框的狀態

@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

在滾動列表中不保存狀態非常gratefull,因爲每次爲行項目創建新對象時。所以你需要在Pojo類(Setter和getter)的幫助下明確地保存CheckBox的狀態。

在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如果它真的解決了你的問題,請回答我的答案。 –

0

感謝您的回答:)我爲每個複選框按鈕創建一個狀態爲數組的stan。 Tommorrow我會嘗試重建我所有的班級,就像博客上的列表一樣,mayby可以幫助我。

但是當我這樣做: 保存狀態:

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; 
 
    } 
 
    
 
    
 

 
    
 
    
 
} 
 
    

相關問題