2014-11-05 53 views
0

我有一個listview,每行有3個單選按鈕。在測試中,我有7行,我正確顯示它們,但是當我在一個raddioButton中選擇一行時,也在第6行中選擇。 不知道爲什麼會發生這種情況。我不明白。RadioButton Android,在其他行中選擇相同的值

我希望你能幫助我,我離開代碼。提前致謝。

我適配器

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

    View rowView = convertView; 

    if (rowView == null) { 

     LayoutInflater inflater = context.getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.list_single, null, true); 
     ViewHolder viewHolder = new ViewHolder(); 

     viewHolder.pregunta = (TextView) rowView.findViewById(R.id.texto_pregunta); 
     viewHolder.rdo1 = (RadioButton) rowView.findViewById(R.id.radio0); 
     viewHolder.rdo2 = (RadioButton) rowView.findViewById(R.id.radio1); 
     viewHolder.rdo3 = (RadioButton) rowView.findViewById(R.id.radio2); 

     rowView.setTag(viewHolder); 
    } 

    ViewHolder holder = (ViewHolder) rowView.getTag(); 
    holder.pregunta.setText((position + 1) + ".- " + desc.get(position)); 
    holder.rdo1.setText(minimo.get(position)); 
    holder.rdo2.setText(maximo.get(position)); 
    holder.rdo3.setText("NA"); 

    return rowView; 
} 

public static class ViewHolder { 
    public TextView pregunta; 
    public RadioButton rdo1; 
    public RadioButton rdo2; 
    public RadioButton rdo3; 
} 
+0

你可以發佈你的活動 – 2014-11-05 04:22:11

+0

你使用的是radiogroup ?. – 2014-11-05 04:26:11

+0

使用ViewHolder holder作爲全局,並將所有3個RadioButton放入RadioGroup。 – 2014-11-05 04:28:07

回答

1

這是因爲發生次被回收內部列表視圖,以降低內存consumtions。因此,它們的絕對位置在ListView中發生了變化。因此,您可以按照從here

這樣的步驟,當檢查RadioButton時,我們必須調用notifyDataSetChanged(),以便所有視圖都得到更新。

當一個RadioButton被選中時,我們必須設置一個selectedPosition來跟蹤哪個RadioButton被選中。

視圖在ListViews內循環使用。因此,它們的絕對位置在ListView中發生了變化。因此,在getView()內部,我們必須在每個RadioButton上調用setTag()。這允許我們在單擊RadioButton時確定列表中RadioButton的當前位置。 RadioButton#setChecked()必須在新的或預先存在的視圖的getView()內更新。

對於您的情況,您可以使用與列表大小相同的整數數組,並且數組中的每個值都描述第一行中選定的單選按鈕索引(因爲您有3個單選按鈕),依此類推。此外,您必須爲每個單選按鈕實現RadioButton.setOnCheckedChangeListener,並在其內部更新整數數組在相應位置的值(例如,如果在您的行中選擇了radiobutton1,則必須將Integer數組中的索引更新爲1) 。每次你必須在你的getView()中檢查/取消選中每個單選按鈕,這取決於整數數組中相應位置的索引。例如,您getView()看起來像這樣

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater inflater = context.getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.list_single, null, true); 

     holder.pregunta = (TextView) convertView 
       .findViewById(R.id.texto_pregunta); 
     holder.rdo1 = (RadioButton) convertView.findViewById(R.id.radio0); 
     holder.rdo2 = (RadioButton) convertView.findViewById(R.id.radio1); 
     holder.rdo3 = (RadioButton) convertView.findViewById(R.id.radio2); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.pregunta.setText((position + 1) + ".- " + desc.get(position)); 
    holder.rdo1.setText(minimo.get(position)); 
    holder.rdo2.setText(maximo.get(position)); 
    holder.rdo3.setText("NA"); 

    // Intialise yourIntegerArray(same size as that of list) in your constructor with 0 value, and 
    // set index 1 for minimo,2 for maximo and 3 for "NA" 
    if (yourIntegerArray[position] == 1) { 
     holder.rdo1.setChecked(true); 
     holder.rdo2.setChecked(false); 
     holder.rdo3.setChecked(false); 
    } else if (yourIntegerArray[position] == 2) { 
     holder.rdo1.setChecked(false); 
     holder.rdo2.setChecked(true); 
     holder.rdo3.setChecked(false); 
    } else if (yourIntegerArray[position] == 3) { 
     holder.rdo1.setChecked(false); 
     holder.rdo2.setChecked(false); 
     holder.rdo3.setChecked(true); 
    } else { 
     holder.rdo1.setChecked(false); 
     holder.rdo2.setChecked(false); 
     holder.rdo3.setChecked(false); 
    } 

    //don't forget to implement RadioButton.setOnCheckedChangeListener here where you have to update the index inside yourIntegerArray at corresponding position 

    return convertView; 
} 

也不要忘了把你裏面單選按鈕每RadioGroup中一行。希望這可以幫助

+0

我試過了,失敗了。你能幫我一些代碼嗎? – 2014-11-10 03:28:41