2013-03-05 3 views
1

Я использую Sectioned ListView в моем приложении в строке ListView я есть TextView и RadioGroup. Так что, когда я нажимаю на кнопку радио обычно он получает щелкнул и работает отлично. Но когда я нажимаю и просматриваю вид, выбранный вид также получает исчез и будет снят.Радиокнопка изменяет состояние на свитке разборные Listview

Это XML я использую

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/relativelay" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_bg" > 

    <TextView 
     android:id="@+id/tvname" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:maxLines="1" 
     android:padding="10dp" 
     android:textColor="#000000" 
     android:textSize="18dp" 
     android:textStyle="bold" /> 

    <RadioGroup 
     android:id="@+id/radioGroup1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:orientation="horizontal" > 

     <RadioButton 
      android:id="@+id/check_present" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_marginRight="20dp" 
      android:onClick="onPresentClick" /> 

     <RadioButton 
      android:id="@+id/check_absent" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toLeftOf="@id/check_present" 
      android:onClick="onPresentClick" /> 
    </RadioGroup> 

</RelativeLayout> 

И это адаптер я использую для Sectioned ListView ....

Это мой обновленный код ....

public class NamesAdapter extends ArrayAdapter<Item> { 

    private ArrayList<Item> items; 
    private LayoutInflater vi; 
    private Item objItem; 
    private ArrayList<Items> presentSelected = new ArrayList<Items>();; 
    private ArrayList<Items> absentSelected = new ArrayList<Items>();; 
    private Map<Integer, Boolean> map = new HashMap<Integer, Boolean>(); 
    ViewHolderSectionName holderSection; 
    ViewHolderName holderName; 
    Items item; 

    public NamesAdapter(Context context, ArrayList<Item> items) { 
     super(context, 0, items); 

     this.items = items; 

     vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

     objItem = items.get(position); 

     if (objItem.isSectionItem()) { 
      ItemsSections si = (ItemsSections) objItem; 

      if (convertView == null 
        || !convertView.getTag().equals(holderSection)) { 
       convertView = vi.inflate(R.layout.alphabet_separator, null); 

       holderSection = new ViewHolderSectionName(); 
       convertView.setTag(holderSection); 
      } else { 
       holderSection = (ViewHolderSectionName) convertView.getTag(); 
      } 

      holderSection.section = (TextView) convertView 
        .findViewById(R.id.alphabet_letter); 

      holderSection.section 
        .setText(String.valueOf(si.getSectionLetter())); 

     } else { 
      Items ei = (Items) objItem; 

      if (convertView == null || !convertView.getTag().equals(holderName)) { 
       convertView = vi.inflate(R.layout.row, null); 

       holderName = new ViewHolderName(); 

       holderName.name = (TextView) convertView 
         .findViewById(R.id.tvname); 

       holderName.radioGroup = (RadioGroup) convertView 
         .findViewById(R.id.radioGroup1); 
       holderName.checkAbsent = (RadioButton) convertView 
         .findViewById(R.id.check_absent); 
       holderName.checkPresent = (RadioButton) convertView 
         .findViewById(R.id.check_present); 

       Boolean present = map.get(position); 

       Log.e("Names Adapter", "is Selected " + present); 

       if (present != null && present.booleanValue()) { 
        // set present checkbox selected 
        holderName.checkPresent.setSelected(true); 
       } else { 
        holderName.checkAbsent.setSelected(true); 
        // set absent checkbox selected 
       } 

       holderName.radioGroup 
         .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

          @Override 
          public void onCheckedChanged(RadioGroup group, 
            int checkedId) { 
           // TODO Auto-generated method stub 
           switch (checkedId) { 
           case R.id.check_absent: 
            item = (Items) holderName.checkAbsent 
              .getTag(); 
            absentSelected.add(item); 
            map.put(position, true); 
            break; 

           case R.id.check_present: 
            item = (Items) holderName.checkPresent 
              .getTag(); 
            presentSelected.add(item); 
            map.put(position, true); 
            break; 

           default: 
            break; 
           } 
          } 
         }); 

       /* 
       * holderName.checkAbsent .setOnCheckedChangeListener(new 
       * CompoundButton.OnCheckedChangeListener() { 
       * 
       * @Override public void onCheckedChanged(CompoundButton 
       * buttonView, boolean isChecked) { // TODO Auto-generated 
       * method stub holderName.checkAbsent.setSelected(isChecked); // 
       * selected1.add(); 
       * 
       * } }); 
       * 
       * holderName.checkPresent .setOnCheckedChangeListener(new 
       * CompoundButton.OnCheckedChangeListener() { 
       * 
       * @Override public void onCheckedChanged(CompoundButton 
       * buttonView, boolean isChecked) { // TODO Auto-generated 
       * method stub holderName.checkAbsent.setSelected(isChecked); // 
       * selected2.add(); 
       * 
       * } }); 
       */ 
       convertView.setTag(holderName); 

      } else { 
       holderName = (ViewHolderName) convertView.getTag(); 
      } 

      if (holderName.name != null) 
       holderName.name.setText(ei.getName()); 
      convertView.setOnCreateContextMenuListener(null); 
     } 
     return convertView; 
    } 

    public static class ViewHolderName { 
     public TextView name; 
     public RadioGroup radioGroup; 
     public RadioButton checkPresent; 
     public RadioButton checkAbsent; 
    } 

    public static class ViewHolderSectionName { 
     public TextView section; 
    } 

} 

ответ

3

Вы должны поддерживать/сохранять состояние «проверенного» радиообмена, чтобы его проверять при прокрутке вверх и вниз, потому что при просмотре списка прокрутки вверх/вниз каждый элемент списка/представления воссоздается по списку адаптер.

Вы должны сохранить позицию/индекс зарегистрированного переключателя, установив прослушиватель на радиокнопку.

Вы можете использовать hashMap для хранения списка элементов как s KEY и 'Checked' status в качестве значения. Когда пользователь отметит флажок, добавьте значение ключа для сопоставления и когда пользователь снимите флажок, чем удалите ключ с карты.

Используйте эту карту в представлении списка рендеринга. Код, как показано ниже:

private Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();  

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

    Boolean present = map.get(position); 
    if(present != null && present.booleanValue()){ 
     // set present checkbox selected 
    } else { 
     // set absent checkbox selected 
    } 

    holderName.radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
       switch (checkedId) { 
        case R.id.check_absent: 
         map.put(position, false) 
         break; 
        case R.id.check_present: 
         map.put(position, true) 
         break; 
       } 
     } 
    }); 
} 
+0

Позвольте мне знать, если вы не можете получить мою точку зрения, так что я могу отправить код для вас –

+0

да @Rakesh Bhalani я получил вашу точку .. позвольте мне попробовать один раз, если я не найти решение, то я попрошу вашу помощь .. и спасибо за намек на решение ... –

+0

Я использовал ваш код, но я не могу решить эту проблему .. он не работает для меня. пожалуйста, помогите мне .. Я стараюсь изо всех сил разрешить его со вчерашнего дня. –

Смежные вопросы