2011-06-27 4 views
0

私は、ListActivityを継承するアクティビティを持ち、XMLレイアウトとカスタムアダプタクラスを使用してリストを作成します。それはすべて、うまくレンダリングし、期待通りです。行XMLには、チェックボックスが含まれています。ListActivityのチェックボックスはリンクされているようです。どうして?どうすれば修正できますか?

今、奇妙なことは、チェックボックスが非常に多くの行にリンクされているように見えることです。つまり、行0のチェックボックスをチェックすると、行8,18,28,38,48などのチェックボックスもチェックされます。

なぜ、どうすればよいでしょうか?

該当する場合は、使用可能な場合にビューを再利用して再利用します。また、チェックされているものの1つを画面の上部にスクロールすると、次にチェックされるのは、画面の下部にある2番目のものです。以下は

getViewコードです:あなたは、あなたが実際に(そう基本的にクリーンアップ)、その中にすべてのコントロールの状態を設定する必要があり、あなたのビューを再利用する場合

public View getView(int position, View convertView, ViewGroup parent) {  
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) 
      mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.contacts_row, null); 
    } 

    cb.GroupMembership.moveToPosition(position); 
    long cid = cb.GroupMembership.getLong(0); 
    String clk = cb.GroupMembership.getString(1); 
    String cnm = cb.GroupMembership.getString(2); 
    long pid = cb.GroupMembership.getLong(3); 

    ImageView bdg = (ImageView) v.findViewById(R.id.contactBadge); 
    Uri pic = GroupsLib.getContactPhotoUri(pid); 
    if (pic == null) { 
     bdg.setImageResource(R.drawable.contactg); 
    } else { 
     bdg.setImageURI(pic); 
    } 

    ((TextView) v.findViewById(R.id.contactName)).setText(cnm); 

    return v; 
} 
+0

アダプター( 'getView')コードをポストしますが、おそらくViewリサイクルの問題です。 – dmon

答えて

2

。正確には再利用されているからです。

通常は(アダプタ内)のようになります。ビューが再利用されたときに

public View getView (int position, View convertView, ViewGroup parent) { 
    SomeObject obj = getDataFromYourModel(position); 
    if (convertView == null) { 
     convertView = ....; //inflate view here 
    } 

    setMyViewParameters(obj,convertView); 
} 

public void setMyViewParameters(SomeObject obj, View view) { 
    CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox_id); 

    cb.setChecked(obj.isChecked); 
    //other initialisation 
} 

このように、あなたは常に値をリセット。

+0

うーん...大丈夫。私はこれらの行に沿って何かを行い、報告する。ありがとう。 – eidylon

+0

Okay ...チェックボックスを実際の値に設定していませんでしたが、今は 'false'に設定して修正しました。あなたの指摘のおかげで、Androidが「インスタント・セーブ」方法論に対応している方法と、これがどのように機能するかがわかりました。そんなことは考えていませんでした。ありがとう! – eidylon

+0

喜んでお手伝いします:) –