【问题标题】:How to show a RadioButton and an EditText inside ListView?如何在 ListView 中显示 RadioButton 和 EditText?
【发布时间】:2023-03-03 10:24:02
【问题描述】:

我想在 ListView 的一行中实现 RadioButton 和 EditText。我正在使用 ArrayAdapter 来填充列表。但问题是,当我选择 RadioButton 并向下滚动列表并再次向上滚动时,已选择的 Radiobutton 未被选中。与 EditText 的内容相同。当我向上滚动时,文本被删除。

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    检查你的适配器,你可能没有在bindView() 上做正确的工作。您必须再次设置 bindView() 的值。

    我会改写句子,你可能会明白。 newView() 仅创建 5-10 个视图(尽可能多地显示在屏幕上),并且它们被重用于其他行。如果您有一个包含 200 行的 ListView,实际上您只有 5-10 个视图,您必须确保使用 bindView() 中的有效更改更新视图。您必须将更改存储/保存到对象以供以后重用。

    【讨论】:

    • 我找不到你。你能用例子解释一下吗……非常感谢。
    • 发布您的适配器以查看您做错了什么。假设您只有 200 条记录的 5 行,并且您必须一直重复使用这 5 行来显示任何范围。
    • 不,编辑原始问题并将其发布到那里。使用 Control + K 进行格式化,使其看起来像代码。
    • arrayadapter中没有bindView方法
    • 是的,android中没有bindView的概念。我必须发送给你的示例代码非常大,这就是我要求邮件ID的原因
    【解决方案2】:

    问题是所有离开屏幕的视图都可能被破坏以节省手机内存。如果手机不这样做,则包含 1000 个条目的列表将填满设备的内存。

    因为单选按钮发生的状态变化和插入到edittext中的文本将被简单地删除,如果用户向上滚动视图将被重新创建。

    您需要在您的适配器中保存单选按钮的状态和编辑文本,并在您在getView 方法中为该特殊项目重新创建视图时重新应用该状态。

    【讨论】:

    • 能否解释一下如何在适配器中保存 RadioButton 和 EditText 的状态。 ..???非常感谢..
    【解决方案3】:

    基本适配器中的getView 函数。如果 convertView 不为 null,则保存 edittext 值并显示相同的值。

        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.list_row_person, null);
                holder = new ViewHolder();
                holder.PersonNameView = (TextView) convertView.findViewById(R.id.PersonNameView);
                holder.SpendAmount = (EditText) convertView.findViewById(R.id.SpendAmt);
                holder.SpendAmount.addTextChangedListener(new TextWatcher() {
    
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        // TODO Auto-generated method stub
                        int position2 = holder.SpendAmount.getId();
                        EditText Caption = (EditText) holder.SpendAmount;
                        Person per= (Person)holder.SpendAmount.getTag();
                        //SpendAmount is of Double type
                        if(s.toString().length()>0){
                        per.setSpendAmount(Double.parseDouble(s.toString()));
                        per.setFlag(true);}
                        else{
                             Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
                            }
    
    
    
    
    
                    }
    
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count,
                            int after) {
                        // TODO Auto-generated method stub
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                        // TODO Auto-generated method stub
    
                    }
                });
    
    
    
    
                holder.SpendAmount.setTag(listData.get(position));
                convertView.setTag(holder);
    
            } else {
    
                ((ViewHolder)convertView.getTag()).SpendAmount.setTag(listData.get(position));
                holder = (ViewHolder) convertView.getTag();
    
            }
    
    
            holder.PersonNameView.setText(listData.get(position).getPersonName());
            holder.SpendAmount.setText(listData.get(position).getSpendAmount().toString());
    
    
    
            return convertView;
    
    
    
    
        }
         class ViewHolder {
            TextView PersonNameView;
            EditText SpendAmount ;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2017-04-28
      • 2020-07-13
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多