3

ListView の EditTexts から値を取得しようとしていますが、うまくいきません。afterTextChanged メソッドで「lista」の配列に設定された値が明らかに失われています。私はAndroidプログラミングの初心者です。誰かが私を助けることができますか? (下手な英語で申し訳ありません)アダプタの getView のコードは次のとおりです。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    final int posicao = position;

    if (convertView == null) {
        LayoutInflater inflater = contexto.getLayoutInflater();
        convertView = inflater.inflate(R.layout.produtos, null);
        holder = new ViewHolder();
        holder.texto = (TextView) convertView.findViewById(R.id.txtDescricao);
        holder.checkbox = (CheckBox) convertView.findViewById(R.id.chkProduto);
        holder.edit = (EditText) convertView.findViewById(R.id.txtValor);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.texto.setText(getItem(position).getTexto());     

    holder.edit.setText("0");
    holder.edit.setTag(new LinhaItemTag(getItem(position), position));  

//here a get an exception just setting the focus on edit
holder.edit.setOnFocusChangeListener(new OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            int posicao = v.getId();
            EditText e = ((EditText) v);
            if (!e.getText().toString().equals("")) {
                if (hasFocus) {
                    if(e.getText().toString().length() != 0)
                        lista.get(posicao).setValor(Double.parseDouble(e.getText().toString()));
                }
            }

        }
    });

    holder.edit.addTextChangedListener( new TextWatcher() {             

        public void afterTextChanged(Editable s)
        {           

            if(s.length() != 0) 
            {
                lista.get(posicao).setValor(Double.parseDouble(s.toString()));              
            }


        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }
    }); 


    holder.checkbox.setOnCheckedChangeListener(null);
    holder.checkbox.setChecked(getItem(position).Selecionado());
    holder.checkbox.setTag(new LinhaItemTag(getItem(position), position));

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            LinhaItemTag elemento = (LinhaItemTag) buttonView.getTag();
            elemento.item.setSelecionado(isChecked);

            if (isChecked) {
                pegos[elemento.position] = true;                
            } else {
                pegos[elemento.position] = false;
            }
            boolean checados = true;
            for (int i = 0; i < lista.size(); i++) {
                if (!pegos[i]) {
                    checados = false;
                    break;
                }
            }
            if (checados) {
                for(int i = 0; i < lista.size(); i++)
                {                   
                    total += lista.get(i).getValor();
                }
                Toast.makeText(contexto, "Compra finalizada - Valor Total: " + total, Toast.LENGTH_LONG).show();
            }
        }
    });

    return convertView;
}

}

この投稿を見て、EditTexts から値を取得することができました: ListView のすべての EditText から値を取得する方法 Bu 今、他の問題に直面しました: リストをロールダウンすると、EditTexts の値が失われます。これは私のコードが今見えるようなものです:

public class MeuAdapter extends ArrayAdapter<LinhaItem> {

private final List<LinhaItem> lista;
private final Activity contexto;
private final boolean[] pegos;
private final double[] valores;
double total;

public MeuAdapter(Activity contexto, List<LinhaItem> lista) {
    super(contexto, 0, lista);
    this.contexto = contexto;
    this.lista = lista;
    pegos = new boolean[lista.size()];
    valores = new double[lista.size()];
    for (int i = 0; i < lista.size(); i++) {
        pegos[i] = false;
        valores[i] = 0;
    }
    total = 0;
}

public class ViewHolder
{
    protected TextView texto;
    protected CheckBox checkbox;
    protected EditText edit;
}

public class LinhaItemTag {

    LinhaItem item;
    int position;

    LinhaItemTag(LinhaItem item, int position) {
        this.item = item;
        this.position = position;
    }
}

private class MeuTextWatcher implements TextWatcher {

    private View v; 

    public MeuTextWatcher(View v)
    {
        this.v = v;     
    }

    @Override
    public void afterTextChanged(Editable e) {
        String s = e.toString();
        LinhaItemTag lTag = (LinhaItemTag) v.getTag();      
        if(s.length() != 0)
        {           
            valores[lTag.position] = Double.parseDouble(s);         
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // TODO Auto-generated method stub

    }

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;  

    if (convertView == null) {
        LayoutInflater inflater = contexto.getLayoutInflater();
        convertView = inflater.inflate(R.layout.produtos, null);
        holder = new ViewHolder();
        holder.texto = (TextView) convertView.findViewById(R.id.txtDescricao);
        holder.checkbox = (CheckBox) convertView.findViewById(R.id.chkProduto);
        holder.edit = (EditText) convertView.findViewById(R.id.txtValor);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.texto.setText(getItem(position).getTexto()); 

    holder.edit.setText("");
    holder.edit.setTag(new LinhaItemTag(getItem(position), position));      

    holder.edit.addTextChangedListener(new MeuTextWatcher(holder.edit));    


    holder.checkbox.setOnCheckedChangeListener(null);
    holder.checkbox.setChecked(getItem(position).Selecionado());
    holder.checkbox.setTag(new LinhaItemTag(getItem(position), position));

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            LinhaItemTag elemento = (LinhaItemTag) buttonView.getTag();
            elemento.item.setSelecionado(isChecked);

            if (isChecked) {
                pegos[elemento.position] = true;                
            } else {
                pegos[elemento.position] = false;
            }
            boolean checados = true;
            for (int i = 0; i < lista.size(); i++) {
                if (!pegos[i]) {
                    checados = false;
                    break;
                }
            }
            String vlrs = "";
            if (checados) {
                for(int i = 0; i < lista.size(); i++)
                {                   
                    total += valores[i];                    
                }
                Toast.makeText(contexto, "Total da compra: " + total, Toast.LENGTH_LONG).show();
            }
        }
    });

    return convertView;
}

}

私は行を変更します:

holder.edit.setText("");

に:

//the valores array is where i store the values in the afterTextChanged method in the TextWatcher class implementation.
holder.edit.setText(**Double.toString(valores[position])**);

しかし、これは期待どおりに機能しません。たとえば、ListView の最初の行の EditText に値を設定すると、この値は、リストをロールダウンした後、リストの 3 行目の EditText に設定されます。 .

4

4 に答える 4

16

から値を取得するには、アクティビティでそれを行うことができますEditTextListViewビューのクリックなどで値が必要になる必要があります。それが起こるたびに、次のコードを書くだけです

View view=listView.getChildAt(position);
EditText editText=view.findViewById(R.id.editText);
String string=editText.getText().toString();

ここで、上記のコードはEditText、 のposition位置にある のテキストを提供しますListView。すべてが正しくチェックされている場合、EditTexts の値の合計が必要なようです。あなたはこのようなものを使うことができます

for(int i=0;i<items.size();i++){
    View view=listView.getChildAt(i);
    EditText editText=view.findViewById(R.id.editText);
    String string=editText.getText().toString();
    if(!string.equals(""))
         total+=Double.parseDouble(string);
}
于 2012-12-25T17:27:06.860 に答える
1

アダプター クラスの getView() メソッドの変更は次のようになります。

 @Override
public View getView(final int position, View view, ViewGroup parent) {

    TextView txt_id, txt_courny_symbol, txt_member_view;
    EditText edit_member_amount;

    final int posicao = position;
    Log.v("ConvertView", String.valueOf(posicao));


    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.list_member_layout, null);
    txt_id = (TextView) view.findViewById(R.id.txt_id);
    txt_courny_symbol = (TextView) view.findViewById(R.id.txt_courny_symbol);
    edit_member_amount = (EditText) view.findViewById(R.id.edit_member_amount);

    edit_member_amount.setTag(new LinhaItemTag(getItem(posicao), posicao));
    edit_member_amount.addTextChangedListener(new MeuTextWatcher(edit_member_amount));

    if (al_contact.size() != 0) {
        MemberClass memberClass = al_contact.get(position);
        txt_id.setText(memberClass.getName());
        txt_courny_symbol.setText(sym);
    }

    return view;

}

ViewHolder クラスを消去します

于 2016-07-22T04:53:16.297 に答える
0

こんにちは、以下のコードを使用してこれを行うことができます。リストビューはコントローラーの状態を行に保存できないため、コントロールの settag と gettag を使用する必要があります。

ソース: https://dl.dropbox.com/u/68130108/ListViewEditItem.rar

http://i.stack.imgur.com/DqKv3.png

于 2012-12-25T13:04:49.217 に答える