ListView,RadioButton:正确显示,但不活动

时间:2013-10-01 22:49:14

标签: android listview radio-button

我有ListView个自己的适配器:CityZipCodesAdapter。在构造函数中,我提供List<CityZipCodesDataModel>,我保留StringStringboolenRadioButton是否已选中)。我写在SharedPreferences然后我读了这个。一切正常。

public class CityZipCodesAdapter extends ArrayAdapter<CityZipCodesDataModel> {

    private final List<CityZipCodesDataModel> list;
    private final Activity context;
    private RadioButton selectedRB;

    private int selectedPosition = -1;

    public CityZipCodesAdapter(Activity context,
            List<CityZipCodesDataModel> list) {
        super(context, R.layout.city_list_item, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView cityOrZipCode;
        protected TextView listOfZipCodesInNear;
        protected RadioButton radioBtn;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ViewHolder viewHolder = null;
        if (view == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.city_list_item, null);
            viewHolder = new ViewHolder();
            viewHolder.cityOrZipCode = (TextView) view.findViewById(R.id.cityOrZipCode);
            viewHolder.listOfZipCodesInNear = (TextView) view.findViewById(R.id.listOfZipCodesInNear);


            viewHolder.radioBtn = (RadioButton)view.findViewById(R.id.radioButton);
            view.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) view.getTag() ;
        }

        viewHolder.radioBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(position != selectedPosition && selectedRB != null){
                    selectedRB.setChecked(false);
                }

                selectedPosition = position;
                selectedRB = (RadioButton)v;
            }
        });


        if(selectedPosition != position){
            viewHolder.radioBtn.setChecked(false);
        }else{
            viewHolder.radioBtn.setChecked(true);
            if(selectedRB != null && viewHolder.radioBtn != selectedRB){
                selectedRB = viewHolder.radioBtn;
            }
        }

        viewHolder.listOfZipCodesInNear.setText(list.get(position).getZipCodes());
        viewHolder.cityOrZipCode.setText(list.get(position).getLocation());

        viewHolder.radioBtn.setText(list.get(position).getLocation());
        viewHolder.radioBtn.setChecked(list.get(position).isSelectedLocation());

        return view;
    }
}

问题是当我打开应用程序时,选择了正确的RadioButton,但它处于非活动状态。只有正确显示。 例如,

x String1

o String2

o String3

当我单击String2(选择了String1)时,选择了String2,但也选择了String1。当我单击String1,然后单击String2时,选择是正确的。

你知道出了什么问题吗? 非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

如果您只需要一个单选按钮来显示可点击状态,那么您必须手动删除其他...我的意思是:

...的onclick

 radio2.setChecked(true);
    radio1.setChecked(false);
     radio3.setChecked(false);

否则你设置你想要设置的任何东西,但是你不要取消其他的... 如果他们都处于相同的位置......它应该很简单......

至于更改其他职位我不认为你所做的工作会有效...我认为每次点击后你需要重建你的列表视图和每个职位变更......或者使用notifyDataSetChanged()或类似的东西该...

为你找到了这个

Custom Listview with CheckBox single selection

认为这会有所帮助......

答案 1 :(得分:1)

我认为问题出在代码的这一部分:

if(selectedPosition != position){
        viewHolder.radioBtn.setChecked(false);
    }else{
        viewHolder.radioBtn.setChecked(true);
        if(selectedRB != null && viewHolder.radioBtn != selectedRB){
            selectedRB = viewHolder.radioBtn;
        }
    }

最初selectedPosition != position因此永远不会设置selectedRB并保持为空。当你最初点击第一个单选按钮时,它会被设置并且它可以正常工作,但如果你没有,代码就不会取消它。