3

ListViewの行内にRadioButtonとEditTextを実装したいと思います。ArrayAdapterを使用してリストにデータを入力しています。しかし、問題は、ラジオボタンを選択してリストを下にスクロールし、もう一度上にスクロールすると、選択されていたラジオボタンが選択されていないことです。EditTextの内容と同じです。上にスクロールするとテキストが削除されます。

4

3 に答える 3

2

問題は、電話のメモリを節約するために、画面を離れるすべてのビューが破棄される可能性があることです。電話がこれを行わない場合、1000 エントリのリストでデバイスのメモリがいっぱいになります。

そのため、ラジオボタンに発生している状態の変化と edittext に挿入されたテキストは単純に削除され、ユーザーが上にスクロールするとビューが再作成されます。

ラジオボタンの状態と編集テキストをアダプターに保存し、 getViewメソッドでその特別なアイテムのビューを再作成するときに状態を再適用する必要があります。

于 2010-06-17T14:04:32.477 に答える
2

アダプタを確認してください。おそらく で仕事をしていないでしょうbindView()。値を再度設定する必要がbindView()あります。

私は文を再定式化し、あなたはおそらく理解するでしょう. はnewView()5 ~ 10 個のビュー (画面に収まる数) のみを作成し、他の行に再利用します。200 行の がある場合ListView、実際には 5 ~ 10 個のビューしかないため、 の有効な変更でビューを更新する必要がありますbindView()。後で再利用するために、オブジェクトへの変更を保存/保存する必要があります。

于 2010-06-17T13:28:35.750 に答える
0

Base Adapter の 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 ;
            }
于 2015-02-01T08:04:40.490 に答える