2012-12-25 5 views
3

ListView에서 EditTexts 값을 가져 오려고하지만 작동하지 않습니다. afterTextChanged 메서드에서 'lista'배열로 설정된 값이 손실됩니다. 나는 안드로이드 프로그래밍에있어 새로운 사람이야. 누가 나를 도울 수 있니? 나는 EditTexts의 값이 게시물을보고 얻을 수 있었다ListView에서 EditText 값 가져 오기

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

} 

: Heres는 내 어댑터에서의 getView에 대한 코드 (죄송합니다 나쁜 영어) 지금 how to retrieve value from all EditText in ListView 니어, 나는 다른 문제에 직면 : 때 내 목록을 아래로 굴림, EditTexts에서 값이 손실됩니다.

holder.edit.setText(""); 

에 :

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

} 

내가 줄 변경 : 내가 예상대로 예를 들어,

//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에 값을 설정합니다.이 값은 목록을 롤아웃 한 후 목록의 세 번째 행에있는 EditText로 설정됩니다.

답변

0

안녕하세요 아래 코드를 사용하면 listview에서 행에 컨트롤러 상태를 저장할 수 없으므로 컨트롤의 settag 및 gettag를 사용해야합니다. 소스

: https://dl.dropbox.com/u/68130108/ListViewEditItem.rar

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

+0

holder.edit 다음에 코드를 기반으로 setOnFocusChangeListener 메서드를 추가했습니다.setTag (새로운 LinhaItemTag (getItem (position), position)); 이제 편집에 초점을 맞추기 만하면 예외가 생깁니다. –

+0

그것이 당신의 문제를 해결 했습니까? – Talha

+0

아무런 문제가 해결되지 않았다. 문제를 해결하지 못했다. 편집에 초점을 둔다. setOnFocusChangeListener를 추가 한 코드를 예외로 만든다. –

13

ListViewEditText의 값을 얻으려면, 당신이 할 수있는 활동에 그. 일부보기 클릭 또는 값에 값이 필요합니다. 그런 일이 그래서 때마다, 바로 위의 코드는 당신에게 당신의 ListViewposition 위치에 존재하는 EditText의 텍스트를 줄 것이다, 여기에 다음 코드

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

물품. 모든 것이 올바르게 검사 될 때 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); 
} 
+0

ListView의 모든 체크 박스가 선택되어 있고 ArrayAdapter 구현에서만 할 수있는 경우 EditTexts에서 값을 가져와야합니다. –

+0

요구 사항 이미지를 게시 할 수 있습니까? 원하는게 뭐야? 나는 아직도 명확하지 않다! – Antrromet

+0

필자가 필요로하는 것은 ListView의 EditTexts 값의 합계를 얻는 것입니다.이 목록의 모든 확인란을 선택하면 위에 게시 한 새 코드를 볼 수 있습니다. –

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; 

} 

삭제 EditTexts의 값을 잃는 우리의 ViewHolder 클래스

0

는 지금까지 성가신 수 있습니다. 작동하면서이 솔루션을 찾았습니다.

귀하의 안드로이드 매니페스트에서 귀하의 목록보기에있는 활동을 선택하십시오. 다음이 코드 블록을 넣어.

android:windowSoftInputMode="adjustPan" 

는 그런 다음 ListView로 이동하여 XML 레이아웃로 이동이이 블록을 넣어.

android:descendantFocusability="beforeDescendants" 
관련 문제