如何在ListView中显示RadioButton和EditText?

时间:2010-06-17 11:56:33

标签: android android-listview

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

3 个答案:

答案 0 :(得分:2)

检查您的适配器,您可能无法在bindView()上完成工作。您必须再次设置bindView()值。

我将重新制定句子,你可能会理解。 newView()仅创建5-10个视图(它们适合屏幕上的多个视图),并且它们可以重复用于其他行。如果您的ListView包含200行,实际上您只有5到10个视图,并且您必须确保使用bindView()中的有效更改来更新视图。您必须将更改存储/保存到对象中以供以后重用。

答案 1 :(得分:2)

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

由于这一点,发生在无线电按钮上的状态变化以及插入到edittext中的文本将被删除,如果用户向上滚动,则将重新创建视图。

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

答案 2 :(得分:0)

基本适配器中的

getView函数。保存edittext值,如果convertView不为null,则显示相同的值。

    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 ;
            }