Android 在适配器中使用onClick侦听器用单选按钮组填充ListView

Android 在适配器中使用onClick侦听器用单选按钮组填充ListView,android,android-listview,android-adapter,Android,Android Listview,Android Adapter,我用适配器填充ListView,但最后一组单选按钮工作不正常 当我选择前三个元素的选项时,效果很好。按下最后一个单选按钮时不工作 这是我的适配器 public class ScoreAdapter extends BaseAdapter { private Activity activity; private LayoutInflater inflater; private List<Score> items; private Resources resources; public

我用适配器填充ListView,但最后一组单选按钮工作不正常

当我选择前三个元素的选项时,效果很好。按下最后一个单选按钮时不工作

这是我的适配器

public class ScoreAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Score> items;
private Resources resources;

public ScoreAdapter(Activity activity, List<Score> items) {
    this.activity = activity;
    this.items = items;
    this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    resources = activity.getResources();
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int location) {
    return items.get(location);
}

@Override
public long getItemId(int position) {
    return position;
}

public List<Score> getItems() {
    return items;
}

public Score getScore(int position) {
    return ((Score) getItem(position));
}

private static class ViewHolder {
    TextView name;
    RadioButton radioTop, radioMiddle, radioLow;
}

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

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_survey, null, false);
        holder = new ViewHolder();

        holder.name = (TextView) convertView.findViewById(R.id.txtName);
        holder.radioTop = (RadioButton) convertView.findViewById(R.id.radioTop);
        holder.radioMiddle = (RadioButton) convertView.findViewById(R.id.radioMiddle);
        holder.radioLow = (RadioButton) convertView.findViewById(R.id.radioLow);

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

    Score item = items.get(position);

    holder.name.setText(item.getQuestionName());

    holder.radioTop.setOnClickListener(listener);
    holder.radioTop.setText(item.getTopDescription());
    holder.radioTop.setChecked(item.isTopScoreSelected());
    holder.radioTop.setTag(position);

    holder.radioMiddle.setOnClickListener(listener);
    holder.radioMiddle.setText(item.getMiddleDescription());
    holder.radioMiddle.setChecked(item.isMiddleScoreSelected());
    holder.radioMiddle.setTag(position);

    holder.radioLow.setOnClickListener(listener);
    holder.radioLow.setText(item.getLowDescription());
    holder.radioLow.setChecked(item.isLowScoreSelected());
    holder.radioLow.setTag(position);


    return convertView;
}

RadioButton.OnClickListener listener = new RadioButton.OnClickListener() {

    @Override
    public void onClick(View view) {
        RadioGroup group = (RadioGroup) view.getParent();
        RadioButton radio = (RadioButton) view;

        Score selected = getScore((Integer) radio.getTag());

        if (selected.getQuestionNumber() == 11 && (radio.getId() == R.id.radioTop || radio.getId() == R.id.radioLow)) {
            DialogFragment modal = new MomentOfTruthDialog(selected);
            modal.show(activity.getFragmentManager(), "motModal");
        }

        selected.setTopScoreSelected(false);
        selected.setMiddleScoreSelected(false);
        selected.setLowScoreSelected(false);

        switch (radio.getId()) {
            case R.id.radioTop:
                radio.setChecked(true);
                selected.setTopScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.TOP_SCORE_VALUE));
                break;
            case R.id.radioMiddle:
                radio.setChecked(true);
                selected.setMiddleScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.MIDDLE_SCORE_VALUE));
                break;
            case R.id.radioLow:
                radio.setChecked(true);
                selected.setLowScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.LOW_SCORE_VALUE));
                break;
        }
    }
};
公共类ScoreAdapter扩展了BaseAdapter{
私人活动;
私人充气机;
私人清单项目;
私人资源;
公共ScoreAdapter(活动、列表项){
这个。活动=活动;
这个项目=项目;
this.inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u inflater\u SERVICE);
resources=activity.getResources();
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共列表getItems(){
退货项目;
}
公共分数getScore(整数位置){
返回((分数)getItem(位置));
}
私有静态类视图持有者{
文本视图名称;
RadioButton radioTop、radioMiddle、radioLow;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=充气机。充气(R.layout.item_测量,空,假);
holder=新的ViewHolder();
holder.name=(TextView)convertView.findViewById(R.id.txtName);
holder.radioTop=(RadioButton)convertView.findViewById(R.id.radioTop);
holder.radioMiddle=(RadioButton)convertView.findViewById(R.id.radioMiddle);
holder.RadioRow=(RadioButton)convertView.findViewById(R.id.RadioRow);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
得分项目=项目。获取(位置);
holder.name.setText(item.getQuestionName());
holder.radioTop.setOnClickListener(listener);
holder.radioTop.setText(item.getTopDescription());
holder.radioTop.setChecked(item.isTopScoreSelected());
支架。radioTop。设置标签(位置);
holder.radioMiddle.setOnClickListener(listener);
holder.radioMiddle.setText(item.getMiddleDescription());
holder.radioMiddle.setChecked(item.isMiddleScoreSelected());
支架。radioMiddle。设置标签(位置);
holder.radioLow.setOnClickListener(listener);
holder.radioLow.setText(item.getLowDescription());
holder.radioLow.setChecked(item.isLowScoreSelected());
支架.radioLow.设置标签(位置);
返回视图;
}
RadioButton.OnClickListener侦听器=新建RadioButton.OnClickListener(){
@凌驾
公共void onClick(视图){
RadioGroup=(RadioGroup)视图。getParent();
RadioButton单选=(RadioButton)视图;
所选分数=getScore((整数)radio.getTag());
if(selected.getQuestionNumber()==11&&(radio.getId()==R.id.radioTop | | radio.getId()==R.id.radioow)){
DialogFragment modal=新的MomentOfTruthDialog(选定);
show(activity.getFragmentManager(),“motModal”);
}
已选择。setTopScoreSelected(false);
已选择。setMiddleScoreSelected(false);
已选择。setLowScoreSelected(false);
开关(radio.getId()){
案例R.id.radioTop:
radio.setChecked(正确);
已选择。setTopScoreSelected(true);
selected.setScoreSelected(resources.getInteger(R.integer.TOP_SCORE_VALUE));
打破
案例R.id.radioMiddle:
radio.setChecked(正确);
已选择。setMiddleScoreSelected(true);
selected.setScoreSelected(resources.getInteger(R.integer.MIDDLE_SCORE_VALUE));
打破
案例R.id.radioLow:
radio.setChecked(正确);
已选择。setLowScoreSelected(true);
selected.setScoreSelected(resources.getInteger(R.integer.LOW_SCORE_VALUE));
打破
}
}
};
}

这是我的模板项

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dip"
android:background="@drawable/shadow"
android:orientation="vertical">

<TextView
    android:id="@+id/txtName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/back_for_header"
    android:gravity="center"
    android:padding="6dip"
    android:textColor="#fff"
    android:textSize="18sp" />

<RadioGroup
    android:id="@+id/radioGroupSurvey"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        style="@style/Survey_Label_For_TextView"
        android:text="@string/top_label" />

    <RadioButton
        android:id="@+id/radioTop"
        style="@style/Survey_RadioButton"/>

    <TextView
        style="@style/Survey_Label_For_TextView"
        android:text="@string/middle_label" />

    <RadioButton
        android:id="@+id/radioMiddle"
        style="@style/Survey_RadioButton" />

    <TextView
        style="@style/Survey_Label_For_TextView"
        android:text="@string/low_label" />

    <RadioButton
        android:id="@+id/radioLow"
        style="@style/Survey_RadioButton"/>

</RadioGroup>
</LinearLayout>

在行布局xml的组中添加以下属性

    android:focusable="false"

谢谢,我解决了我的问题

这是我的适配器:

public class ScoreAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Score> items;
private Resources resources;

public ScoreAdapter(Activity activity, List<Score> items) {
    this.activity = activity;
    this.items = items;
    this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    resources = activity.getResources();
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int location) {
    return items.get(location);
}

@Override
public long getItemId(int position) {
    return position;
}

public List<Score> getItems() {
    return items;
}

private static class ViewHolder {
    TextView name;
    RadioGroup radioGroup;
    RadioButton radioTop, radioMiddle, radioLow;
}

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

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_survey, null, false);
        holder = new ViewHolder();

        holder.name = (TextView) convertView.findViewById(R.id.txtName);
        holder.radioGroup = (RadioGroup) convertView.findViewById(R.id.radioGroupSurvey);
        holder.radioTop = (RadioButton) convertView.findViewById(R.id.radioTop);
        holder.radioMiddle = (RadioButton) convertView.findViewById(R.id.radioMiddle);
        holder.radioLow = (RadioButton) convertView.findViewById(R.id.radioLow);

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

    Score item = (Score) getItem(position);

    holder.name.setText(item.getQuestionName());

    holder.radioGroup.setOnCheckedChangeListener(null);

    holder.radioTop.setText(item.getTopDescription());
    holder.radioTop.setChecked(item.isTopScoreSelected());
    holder.radioMiddle.setText(item.getMiddleDescription());
    holder.radioMiddle.setChecked(item.isMiddleScoreSelected());
    holder.radioLow.setText(item.getLowDescription());
    holder.radioLow.setChecked(item.isLowScoreSelected());

    holder.radioGroup.setTag(position);
    holder.radioGroup.setOnCheckedChangeListener(listener);

    return convertView;
}

RadioGroup.OnCheckedChangeListener listener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int id) {

        RadioButton radio = (RadioButton)radioGroup.findViewById(radioGroup.getCheckedRadioButtonId());

        Score selected = (Score) getItem((Integer) radioGroup.getTag());
        boolean showMOT = false;

        selected.setTopScoreSelected(false);
        selected.setMiddleScoreSelected(false);
        selected.setLowScoreSelected(false);

        radio.setChecked(true);
        radio.setSelected(true);
        switch (id) {
            case R.id.radioTop:
                showMOT = true;
                selected.setTopScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.TOP_SCORE_VALUE));
                break;
            case R.id.radioMiddle:
                selected.setMiddleScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.MIDDLE_SCORE_VALUE));
                break;
            case R.id.radioLow:
                showMOT = true;
                selected.setLowScoreSelected(true);
                selected.setScoreSelected(resources.getInteger(R.integer.LOW_SCORE_VALUE));
                break;
        }

        if (selected.getQuestionNumber() == 11 && showMOT)
            showDialogMOT(selected);
    }
};

private void showDialogMOT(Score score) {
    DialogFragment modal = new MomentOfTruthDialog(score);
    modal.show(activity.getFragmentManager(), "motModal");
}
}
公共类ScoreAdapter扩展了BaseAdapter{
私人活动;
私人充气机;
私人清单项目;
私人资源;
公共ScoreAdapter(活动、列表项){
这个。活动=活动;
这个项目=项目;
this.inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u inflater\u SERVICE);
resources=activity.getResources();
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共列表getItems(){
退货项目;
}
私有静态类视图持有者{
文本视图名称;
放射组放射组;
RadioButton radioTop、radioMiddle、radioLow;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=充气机。充气(R.layout.item_测量,空,假);
holder=新的ViewHolder();
holder.name=(TextView)convertView.findViewById(R.id.txtName);
holder.radioGroup=(radioGroup)convertView.findViewById(R.id.radioGroup调查);
holder.radioTop=(RadioButton)convertView.findViewById(R.id.radioTop);
holder.radioMiddle=(RadioButton)convertView.findViewById(R.id.radioMiddle);
holder.RadioRow=(RadioButton)convertView.findViewById(R.id.RadioRow);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
得分项目=(得分)获取项目(位置);
holder.name.setText(item.getQuestionName());
放射组