Obtenez de l'EditText valeurs de ListView
Je vais essayer d'obtenir les valeurs de la EditTexts dans une ListView, mais sa ne fonctionne pas. Les valeurs de mon tableau de "lista" dans le afterTextChanged méthode sont apparemment perdu. Je suis nouveau dans la programmation android, quelqu'un peut-il m'aider? (désolé pour les mauvais en anglais)
Voici le code pour le getView dans ma carte:
@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;
}
}
J'ai réussi à obtenir les valeurs de la EditTexts regarder ce post: comment faire pour récupérer la valeur de toutes les EditText dans ListView
Bu maintenant, j'ai fait face avec un autre problème: quand je roule ma liste vers le bas, les valeurs de la EditTexts sont perdus.
C'est comme mon code ressemble maintenant:
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;
}
}
J'ai changer la ligne:
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])**);
Mais cela ne fonctionne pas comme prévu, par exemple, si j'ai mis une valeur à l'EditText de la première ligne de la liste, cette valeur, après je roule en bas de la liste, est sertie de EditText dans la troisième ligne de la liste...
OriginalL'auteur Danilo Silva | 2012-12-25
Vous devez vous connecter pour publier un commentaire.
Pour obtenir les valeurs de la
EditText
dans votreListView
, vous pouvez le faire dans votre activité. Vous devez avoir besoin de les valeurs sur certains vue sur ou quelque chose. Donc, chaque fois que cela se produit, il suffit d'écrire le code suivantIci, le code ci-dessus va vous donner le texte de la
EditText
qui est présent dans leposition
position de votreListView
. Il semble que vous avez besoin de la somme des valeurs de la EditTexts lorsque tous sont vérifiées droit? Vous pouvez utiliser quelque chose comme cela, alorsPourriez-vous poster une image de votre condition? Qu'est ce que vous voulez? Je ne suis pas encore clair!
Tout ce que je besoin est d'obtenir la somme des valeurs de la EditTexts dans une liste lorsque toutes les cases dans cette liste sont vérifiées, prendre le je me regarde dans le nouveau code que j'ai posté ci-dessus.
J'ai résolu le problème de l'obtention de la somme des valeurs comme je l'ai mentionné dans mon post édité, le problème est maintenant, quand un rouleau en bas de la liste, les valeurs des Modifications sont perdues.
Les valeurs sont perdues parce que la liste de réutilisation des composants. Dans le getView() de la carte, vous devez stocker les valeurs de la editTexts et attribuez-la à nouveau!
OriginalL'auteur Antrromet
changement de classe d'adaptateur getView() les méthodes ressemblent.
OriginalL'auteur MalhotraUrmil
salut vous pouvez utiliser le code ci-dessous pour ce faire, listview ne peut pas enregistrer les contrôleurs de l'état de la ligne, de sorte que vous devez utiliser settag et gettag de contrôles.
pour source: https://dl.dropbox.com/u/68130108/ListViewEditItem.rar
fait-il résolu votre problème?
pas de talhakosen le problème n'est pas résolu, réglage de la netteté sur edit, j'obtiens une exception avec le code que j'ai modifié en ajoutant le setOnFocusChangeListener
si vous pouvez envoyer votre code pour moi, je ne comprends pas wht il ne marche pas. [email protected]
pouvez-vous mettre à jour le code source de lien? il ne fonctionne pas! veuillez le mettre sur github!
OriginalL'auteur Talha
Perdre les valeurs de EditTexts peut être gênant dans la mesure. J'ai trouvé cette solution tout en travaillant.
Dans votre manifeste android, choisissez l'activité qui de votre liste et la vue est en. Ensuite, mettez ce code-block.
Ensuite, allez à votre
ListView
et accédez au document xml de mise en page et de mettre ce bloc-là.OriginalL'auteur Gayashan Perera