问题
I have a custom listview which is done with getView. It must be 4 textview and a radiobutton on the right in each row. I saw many examples about this here but couldn't get the idea. Here is my getView function. With this situation i can see the rows but radiobuttons are still checked when i choose another radiobutton. What should i have to add to the function to make radiobuttons work properly and get Id of the selected one? Thanks
private static class CitizenAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public CitizenAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return sicilArr.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.table_row_citizen, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.TextView01);
holder.text2 = (TextView) convertView.findViewById(R.id.TextView02);
holder.text3 = (TextView) convertView.findViewById(R.id.TextView03);
holder.text4 = (TextView) convertView.findViewById(R.id.TextView04);
holder.radioCitizen = (RadioGroup) convertView.findViewById(R.id.radioGroupCitizen);
holder.radioButCitizen = (RadioButton) convertView.findViewById(R.id.radioButtonCitizen);
holder.radioCitizen.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text1.setText(array1.get(position));
holder.text2.setText(array2.get(position));
holder.text3.setText(array3.get(position));
holder.text4.setText(array4.get(position));
return convertView;
}
static class ViewHolder {
TextView text1;
TextView text2;
TextView text3;
TextView text4;
RadioGroup radioCitizen;
RadioButton radioButCitizen;
}
}
Also this is my xml row file:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:gravity="left|center"
android:layout_width="wrap_content"
android:paddingBottom="10px"
android:paddingTop="10px"
android:paddingLeft="3px">
<TextView
android:id="@+id/TextView01"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15dip"
android:textStyle="bold"
android:textColor="#d08021">
</TextView>
<TextView
android:id="@+id/TextView02"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15dip"
android:textStyle="bold"
android:textColor="#81A2BC">
</TextView>
<TextView
android:id="@+id/TextView03"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15dip"
android:textStyle="bold"
android:textColor="#81A2BC">
</TextView>
<TextView
android:id="@+id/TextView04"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15dip"
android:textStyle="bold"
android:textColor="#81A2BC">
</TextView>
<RadioGroup
android:id="@+id/radioGroupCitizen"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radioButtonCitizen"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RadioGroup>
回答1:
One way is to manually uncheck all others radiobuttons. You can create variable that will keep position of currently selected item. And in getView
you check/uncheck current radio button depending on whether current position equals to selected one. When use press radio button you change position of selected item and call notifyDatasetChanged
.
Also check this quesion: Android ListView with RadioButton in singleChoice mode and a custom row layout
1) Add private int selected = -1
to CitizenAdapter
.
2) Add click listener to each radiobutton:
holder.radioCitizen.setOnClickLisener(new View.OnClickListener()
{
@Override
public void onCheckedChanged(View view) {
selected = (Integer) view.getTag();
notifyDataSetChanged();
}
});
3) Set tag for each radiobutton to current position and set checked state:
// After you set text to 4 textviews
holder.radioButCitizen.setTag(position);
holder.radioButCitizen.setChecked(position == selected);
回答2:
int selected = 0;
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
ViewHolder holder;
final RadioButton motif;
if (null == convertView)
{
convertView = View
.inflate(parent.getContext(), R.layout.motif_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
motif = (RadioButton) holder.getmotif();
motif.setTag(position);
motif.setText(motifList.get(position));
if(position == 0)
{
motif.setChecked(true);
}
else
motif.setChecked(false);
motif.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
selected = position;
notifyDataSetChanged();
}
});
if(position == selected)
motif.setChecked(true);
else
motif.setChecked(false);
return convertView;
}
private class ViewHolder {
private View mRow;
private RadioButton motif = null;
public ViewHolder(View row) {
mRow = row;
}
public RadioButton getmotif() {
if (motif == null) {
motif = (RadioButton) mRow.findViewById(R.id.itemMotif);
}
return motif;
}
}
来源:https://stackoverflow.com/questions/14608479/using-radio-button-in-custom-listview-in-android