2011-01-10 10 views
2

私はカスタムBaseAdapterを持つリストビューを持っており、各行にはチェックボックスと3つのテキストビューが含まれています。私は、Layoutinflaterを使用してxmlファイルからこの行を膨張させています。しかし、私がチェックするたびに、多くの他のチェックボックスがリスト全体でチェックされますが、チェックしたい元のチェックボックスはチェックされることがあります。問題のあるアンドロイドリストビューのチェックボックス

ユーザーがチェックボックスを選択するたびに、そのチェックボックスの添付された一意の値をコレクションに保存しています。次回getViewメソッドが呼び出されると、チェックボックスの値がコレクション内に既に存在するかどうかに基づいてgetView()内のビューを返す前にチェックボックスを手動でチェック/チェック解除します。しかし、これにもかかわらず、これらのチェックボックスのチェックチェンジリストが起動していないにもかかわらず、それらのチェックボックスをマークしています。私は疑問ですが、これはビューがgetViewで再利用されているためですが、この全部のものを動作させるには良い方法は何もわかりません。

+2

getViewメソッドをここに含めることができますか?私は問題がそこにあると思う。 – Juhani

+0

http://stackoverflow.com/questions/5715630/checkboxes-in-the-list-randomly-get-checked-unchecked-when-i-scroll-through-and/7076486#7076486これは既に議論されていますそれと一緒に。ありがとう。 – SALMAN

答えて

3

問題はあなたのgetView()メソッド内にあります。 N_JOY:

この

public View getView(int position, View convertView, ViewGroup parent) { 
     View vu = convertView; 
     ViewHolder vHolder = null; 
     try { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      if (vu == null) { 
       vu = (View) inflater.inflate(R.layout.list_fr_req, null); 
       vHolder = new ViewHolder(); 
       vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox); 
       vu.setTag(vHolder); 
      } else { 
       vHolder = (ViewHolder) vu.getTag(); 
      } 
      vHolder.checkbox.setOnCheckedChangeListener(this); 

      vHolder.checkbox.setId(position); 
      vHolder.textView.setId(position); 

      if (myList.get(position).getCheckedStatus()) 
       vHolder.checkbox.setChecked(true); 
      else 
       vHolder.checkbox.setChecked(false); 

     } catch (Exception e) { 
      Log.d("Exception in getview", e + ""); 
      e.printStackTrace(); 
     } 
     return vu; 
    } 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      list.get(buttonView.getId()).setCheckedStatus(true); 
     } else { 
      list.get(buttonView.getId()).setCheckedStatus(false); 
     } 
    } 

    public static class ViewHolder { 
     CheckBox checkbox; 
     TextView textview; 
    } 

よろしくようなものを試してみてください。

+0

vHolder.checkbox.setChecked(false)を呼び出すときにはわかりませんが、 (リスナーで)、onCheckedChangeListenerはシステムから再度呼び出されませんか? –

+2

ねえ、これは私のコードなので、うまくいきます。これは疑問ではなかった、私は答えを掲示した。いくつかのAndroidフォンで –

+0

を呼び出すと、setChecked()によってonCheckedChanged()が呼び出され、予期しない結果が発生します。 – shihpeng

6

if(convertView == null)、それ以外の部分全体 それは間違いなくあなたのために働くでしょう。ありがとう。

+0

がconvertviewのメリットになります。しかし、それは迅速な修正です –

0

OnCheckedChangeListenerの代わりにOnClickListenerを使用します。後者は、リサイクルされたビューをオブジェクトの値と一致するように更新した場合でもトリガーされます。次のgetView()のコードでは、オブジェクトのチェック値(itemMap)を格納するためにHashMapを使用しています。

  boolean checked=itemMap.get(currentObject); 
      if(checked!=checkBox.isChecked()) 
       checkBox.setChecked(checked); 
      checkBox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        CheckBox checkBox1=(CheckBox)v; 
        if(checkBox1.isChecked()) //ckecked 
        { 
         itemMap.put(currentObject,true); 
         if(checkListener!=null) 
          checkListener.onCheck(position,convertView,parent,adapter); 
        } 
        else{ //unchecked 
         itemMap.put(currentObject,false); 
         if(checkListener!=null) 
          checkListener.onUnCheck(position,convertView,parent,adapter); 
        } 
       } 
      }); 

checkListenerは、クラスのユーザーが追加できる追加のリスナーです。

関連する問題