【问题标题】:Android - Radio Button in listView?Android - listView 中的单选按钮?
【发布时间】:2011-10-12 13:12:53
【问题描述】:

我有一个场景,我们应该在列表视图中有一个单选模式单选按钮。当我单击单选按钮时,它应该进入启用状态。当我单击整个项目时,它应该重定向到新活动。我参考了下面的链接

link1link2

我可以找到多选模式的方法。但不适用于单选模式。对此有何想法?

???编辑??? 如何在列表视图中找到项目的相应标签的标签

【问题讨论】:

    标签: android listview


    【解决方案1】:

    一种方法,但我不知道它是否完美。

    当您单击另一个单选按钮时,跟踪当前选中单选按钮的列表视图的位置 ID,然后执行 setOnCheckedChangeListener(listener) 并检查已选中的位置并取消选中该单选按钮。

    您可以将单选按钮的状态存储到添加到列表视图中的自定义模型中(模型包含文本视图、图像视图、单选按钮等用于列表视图单行的控件)

    查看this 文章以使用模型并将组件处理到列表视图中,在此给出复选框示例

    更新

    我认为你可以这样获得标签

    ((View)((ViewGroup)listview.getItemAtPosition(0)).getTag()).getTag();
    or
    ((Button)l.getItemAtPosition(0)).getTag();
    

    更新 2

    假设这是你的适配器和数组列表对象

    private List<Model> list_model = new ArrayList<Model>();
    
    private ArrayAdapter<Model> modelAdapter;
    

    你的模型类看起来像这样

    private class Model{
        private String text1 = "";
        private boolean isChecked   = false;
    
        public Model(String text1){
            this.text1 = text1;
            isChecked = false;
        }
    }
    

    你的观众

    private static class ViewHolder{
        TextView textView;
            RadioButton radioBtn;
    }
    

    在构造函数中将列表模型传递给这个 CustomAdapter 类

    private List<Model> list;
    private Context context;
    
    public CustomAdapter(Context context, List<Model> list){
        super(context,R.layout.list_layout,list);
        this.list = list;
        this.context = context;
    }
    

    现在在getView()

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
    
        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.gcalendar_list_layout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) view.findViewById(R.id.text1);
            viewHolder.radioBtn = (RadioButton) view.findViewById(R.id.radioBtn);
            viewHolder.radioBtn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    Model element = (Model) viewHolder.checkBox.getTag();
                    element.isChecked = buttonView.isChecked();
                    boolean isChecked = true;
                    for(int i=0;i<list.size();i++){
                        if(!list.get(i).isChecked){
                            list.get(i).isChecked=false; // more implement here or may be this work
                            break;
                        }
                    }
                }
            });
            view.setTag(viewHolder);
            viewHolder.radioBtn.setTag(list.get(position));
        }else{
            view = convertView;
            ((ViewHolder)view.getTag()).radioBtn.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.textView.setText(list.get(position).name);
        holder.radioBtn.setChecked(list.get(position).isChecked);
        return view;
    }
    

    【讨论】:

    • 但它不起作用。它不会禁用处于选中状态的上一个单选按钮。
    【解决方案2】:

    只有一个可供选择的按钮小部件是 CheckBox。不过,您必须在列表适配器中进行一些调整 - 您需要注册自定义事件侦听器 在配置列表条目视图时,请记住这些视图被重用 (如果您不关心性能,也可以创建新视图)

    【讨论】:

    • 好的。然后我可以自定义复选框图像。我必须更改复选框的主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多