2015-10-18 3 views
0

У меня есть список студентов в ListView, для которых я хочу отслеживать посещаемость (несколько похожа на How to get checked radio button in list view? и Listview with Checkbox,RadioButton,Textview and button not working correctly in android).Как получить выбранный переключатель для каждой строки в ListView

Когда пользователь нажимает кнопку отправки, мне нужно знать для каждой строки, для чего была установлена ​​Радиогруппа, чтобы затем сохранить значения обратно в базу данных (до сих пор использовала SimpleCursorAdapter).

Я просмотрел SimpleCursorAdapter.getCount() и RadioGroup.getCheckedRadioButtonId(), чтобы использовать for-loop для перемещения по списку, но до сих пор не могу понять, как получить доступ к RadioGroup для каждого элемента списка.

listView.getAdapter(). GetItem() ???

Не могли бы вы указать мне в правильном направлении? Я не пытаюсь ничего делать, когда пользователь проверяет элемент или когда изменяется состояние кнопки.

Заранее спасибо.

ответ

1

использовать viewHolder в вашей ListView

Model.java

public class Model { 

    private String name; 
    private boolean selected; 

    public Model(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 
} 

MainActivity.java

public class MainActivity extends Activity implements OnItemClickListener{ 

    ListView listView; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     listView = (ListView) findViewById(R.id.my_list); 
     adapter = new MyAdapter(this,getModel()); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
       TextView label = (TextView) v.getTag(R.id.label); 
    CheckBox checkbox = (CheckBox) v.getTag(R.id.check); 
    Toast.makeText(v.getContext(), label.getText().toString()+" "+isCheckedOrNot(checkbox), Toast.LENGTH_LONG).show(); 
    } 

    private String isCheckedOrNot(CheckBox checkbox) { 
     if(checkbox.isChecked()) 
     return "is checked"; 
     else 
     return "is not checked"; 
    } 

    private List<Model> getModel() { 
     list.add(new Model("Linux")); 
     list.add(new Model("Windows7")); 
     list.add(new Model("Suse")); 
     list.add(new Model("Eclipse")); 
     list.add(new Model("Ubuntu")); 
     list.add(new Model("Solaris")); 
     list.add(new Model("Android")); 
     list.add(new Model("iPhone")); 
     list.add(new Model("Java")); 
     list.add(new Model(".Net")); 
     list.add(new Model("PHP")); 
     return list; 
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<ListView 
android:id="@+id/my_list" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" /> 

</LinearLayout> 

row.xml 

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" > 

<TextView 
android:id="@+id/label" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@+id/label" 
android:textSize="30sp" > 
</TextView> 

<CheckBox 
android:id="@+id/check" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentRight="true" 
android:layout_marginLeft="4dip" 
android:layout_marginRight="10dip" 
android:focusable="false" 
android:focusableInTouchMode="false" > 
</CheckBox> 

</RelativeLayout> 

MyAdapter.java

public class MyAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

    public MyAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.row, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 
    } 

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

     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
      viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
       } 
      }); 
      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.label, viewHolder.text); 
      convertView.setTag(R.id.check, viewHolder.checkbox); 
      } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.checkbox.setTag(position); // This line is important. 

     viewHolder.text.setText(list.get(position).getName()); 
     viewHolder.checkbox.setChecked(list.get(position).isSelected()); 

     return convertView; 
    } 
} 
-1

Я также столкнулся с той же проблемой теперь, что вы должны должны сделать это

  • просто использовать getChildCount() на ListView
  • Используйте петлю из для (I = 0 ДО childoflist)
  • Теперь получите ребенка в i-ом месте списка, используя view=listview.getChildAt(i)
  • Теперь вы должны сделать что-то вроде radiogroup=view.findViewById(R.id.radiogrp)
  • Теперь у вас есть все вещи, то и должны сделать radioButton = (RadioButton) rgg.findViewById(selectedId);

Здесь я прилагаю мой код, который в дополнение к Akhil Джаякумар код списка студентов

///ok is your upload button 

ok.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final int child=listView.getChildCount(); 
      for(int i=0;i<child;i++) { 
      View rgg=listView.getChildAt(i); 

    radioGroup = (RadioGroup) rgg.findViewById(R.id.radio); 

    int selectedId=radioGroup.getCheckedRadioButtonId(); 

    radioButton = (RadioButton) rgg.findViewById(selectedId); 

    } 
} 
}); 
+0

Постараюсь его как как только я нахожу время. Спасибо, что вернулись ко мне. – andr

1
ok.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    final int child=listView.getChildCount(); 
     for(int i=0;i<child;i++) { 
     if(listView.childAt(i) instanceof RadioGroup){ 
     RadioGroup rg=(RadioGroup)listView.childAt(i); 
     int a = rg.getChildCount(); 
     for(int j=0;j<a;++j) { 
      if((RadioButton)rg.getChildAt(j).isChecked()==true) { 
      System.out.println("RadioButton At "+j+" Is Selected");} 
      } 
     } 
    } 
} 
}); 
+0

Попробуй, как только я найду время. Спасибо, что вернулись ко мне. – andr

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

  • Нет связанных вопросов^_^