2013-04-22 113 views
0

我有一個列表視圖,它有一個textview和一個複選框。android - 列表適配器問題

當我選擇一個列表項時,該行中的複選框被選中,此外還選中了一個不同行的額外複選框。任何想法爲什麼發生這種情況?

我的適配器我在哪裏填充列表視圖:

public class ContactAdaper extends BaseAdapter 
{ 
    private Context myContext; 
    private LayoutInflater inflater;  
    private ArrayList listname; 
    private ArrayList list_no; 
    private List<ContactPojo> contactList; 
    private ContactPojo contactObj; 
    public ContactAdaper(ContactActivity contactActivity,ArrayList listname,ArrayList list_no,List<ContactPojo> listToAddContacts) 
    { 
     this.myContext = contactActivity; 
     this.listname = listname; 
     this.list_no = list_no; 
     this.contactList = listToAddContacts; 
    } 

    @Override 
    public int getCount() 
    { 
     return listname.size(); 
    } 

    @Override 
    public Object getItem(int arg0) 
    { 
     return arg0; 
    } 

    @Override 
    public long getItemId(int arg0) 
    { 
     return arg0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 

      inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      convertView = inflater.inflate(R.layout.contact_row, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.txtMobNum = (TextView) convertView.findViewById(R.id.name); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 
      viewHolder.txtName = (TextView)convertView.findViewById(R.id.id); 

      convertView.setTag(viewHolder); 
     } 

     final ViewHolder holder = (ViewHolder) convertView.getTag(); 
     holder.txtMobNum.setText(list_no.get(position).toString()); 
     holder.txtName.setText(listname.get(position).toString()); 


     if(holder != null) 
     { 
      /*holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
      { 

       public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) 
       { 
        // Toast.makeText(myContext, "Selected item is :-" +buttonView.getId(), Toast.LENGTH_LONG).show(); 

        if(isChecked) 
        { 
         Toast.makeText(myContext, "Selected Name AND Number is :-" + 
           holder.txtName.getText().toString()+", "+holder.txtMobNum.getText().toString(), Toast.LENGTH_LONG).show(); 

         contactObj = new ContactPojo(); 
         contactObj.name = holder.txtName.getText().toString(); 
         contactObj.mobile = holder.txtMobNum.getText().toString(); 

         contactList.add(contactObj); 
        } 
        else 
        { 
         removeContact(holder.txtMobNum.getText().toString()); 
         notifyDataSetChanged(); 
         Log.d("Cont", holder.txtName.getText().toString()+" = "+holder.txtMobNum.getText().toString()+" is removed from the list "); 

        } 
       } 
      });*/ 

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

       @Override 
       public void onClick(View v) 
       { 
        boolean checked = ((CheckBox) v).isChecked(); 
        switch(v.getId()) 
        { 
         case R.id.checkBox: 
          if (checked) 
          { 
           Toast.makeText(myContext, "Selected Name AND Number is :-" + 
             holder.txtName.getText().toString()+", "+holder.txtMobNum.getText().toString(), Toast.LENGTH_LONG).show(); 

           contactObj = new ContactPojo(); 
           contactObj.name = holder.txtName.getText().toString(); 
           contactObj.mobile = holder.txtMobNum.getText().toString(); 

           contactList.add(contactObj); 
          } 
          else 
          { 
           removeContact(holder.txtMobNum.getText().toString()); 
           notifyDataSetChanged(); 
           Log.d("Cont", holder.txtName.getText().toString()+" = "+holder.txtMobNum.getText().toString()+" is removed from the list "); 
          } 

          break; 
        } 
       } 
      }); 
     } 
     return convertView;    
    }  

    private void removeContact(String mobile) 
    { 
     Iterator<ContactPojo> it = contactList.iterator(); 
     while (it.hasNext()) 
     { 
      ContactPojo contact = it.next(); 
      if(contact.mobile.equals(mobile)) 
      { 
       it.remove(); 
      } 
     } 
    } 
}  
class ViewHolder 
{ 
    TextView txtMobNum; 
    TextView txtName; 
    CheckBox checkBox; 
} 

//這裏是我的列表行

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:layout_margin="30dp" 
    > 

<TextView 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#000000" 
    android:layout_marginLeft="20dp" 
    /> 
<TextView 
    android:id="@+id/id" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:textColor="#000000" 
    /> 
<CheckBox 
    android:id="@+id/checkBox" 
    android:tag="tagCheck" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:checked="false" 
    /> 
</LinearLayout> 
+0

您能否顯示您的佈局contact_row? – 2013-04-22 11:03:35

+0

@鄒鄒我編輯了我的問題請檢查並回復 – Ajeet 2013-04-22 11:59:28

回答

0

這可能是你的convertView未正確重用準備的事實。

public View getView(int position, View convertView, ViewGroup parent)當列表項「進入屏幕」被調用(例如:在滾動過程中或當視圖是重裝)

convertView傳遞給此方法包含一個細胞,其已經被「移動屏幕外」和可以重複使用另一個單元來節省內存。在你的代碼中,convertView中的textViews會重新賦值它們的值,所以它們會被更新,但是複選框只會得到一個新的監聽器,並且保留舊的選擇值。 當您看到另一個單元格被選中時,它是從convertView加載的這個舊值。

要解決這個問題,請記住應該選擇哪些行,並在創建視圖/重新使用converview時相應地設置複選框值。