2012-02-17 13 views
10

Ho una voce di elenco con EditText al suo interno, non so quanti oggetti ci saranno. Ho un problema quando inserisco del testo in EditText, quindi scorro verso il basso fino a ListView, dopo che ho fatto scorrere di nuovo non c'è testo nel mio primo EditText, o c'è del testo da altro EditText da ListView.Android: EditText perde contenuto sullo scorrimento in ListView?

Ho provato TextWatcher e ho salvato i dati sull'array, ma i problemi sono che la posizione di visualizzazione restituita in ListView non sempre ha ragione, quindi ho perso alcuni dati dall'array.

Per favore aiuto.

Ecco il mio codice:

public class EfficientAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    public String[] Current; 
    ArrayList<String> MeterName, PreviousReading, Current_Reading; 
    JSONArray getArray_Meter_Reading; 

    public EfficientAdapter(Context context, JSONArray getArray_Meter_Reading) { 
     mInflater = LayoutInflater.from(context); 
     this.getArray_Meter_Reading = getArray_Meter_Reading; 
     MeterName = new ArrayList<String>(); 
     PreviousReading = new ArrayList<String>(); 
     for (int i = 0; i < getArray_Meter_Reading.length(); i++) { 
      try { 
       String Meter_Name = getArray_Meter_Reading.getJSONObject(i) 
         .getString("MeterName").toString(); 
       String previous_Meter_Reading = getArray_Meter_Reading 
         .getJSONObject(i).getString("PrevMeterReading") 
         .toString(); 
       MeterName.add(Meter_Name); 
       PreviousReading.add(previous_Meter_Reading); 

       // Meter[i]=MeterName.get(i); 
       // Previous[i]=PreviousReading.get(i); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    public int getCount() { 

     return getArray_Meter_Reading.length(); 
    } 

    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

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

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.meter_reading_list, null); 
      holder = new ViewHolder(); 
      holder.adp_MeterName = (TextView) convertView 
        .findViewById(R.id.txt_Meter_Name); 
      holder.adp_Previous = (TextView) convertView 
        .findViewById(R.id.txt_Previous); 
      holder.adp_Current = (EditText) convertView 
        .findViewById(R.id.ed_Current); 

      holder.adp_Current.addTextChangedListener(new TextWatcher() { 

       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 

       } 

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

       } 

       public void afterTextChanged(Editable s) { 

        Current[holder.ref] = s.toString(); 

       } 
      }); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.ref = position; 
     holder.adp_MeterName.setText(MeterName.get(position)); 
     holder.adp_Previous.setText(PreviousReading.get(position)); 
     // holder.adp_Current.setHint(MeterName.get(position)); 

     // holder.adp_Current.setText(PreviousReading.get(position)); 

     return convertView; 
    } 

    class ViewHolder { 
     TextView adp_MeterName, adp_Previous; 
     EditText adp_Current; 
     int ref; 

    } 

} 

risposta

8

provare questo:

public class EfficientAdapter extends BaseAdapter { 

private LayoutInflater mInflater; 
public String[] Current; 
ArrayList<String> MeterName, PreviousReading, Current_Reading; 
JSONArray getArray_Meter_Reading; 
public static HashMap<Integer,String> myList=new HashMap<Integer,String>(); 

public EfficientAdapter(Context context, JSONArray getArray_Meter_Reading) { 
    mInflater = LayoutInflater.from(context); 
    this.getArray_Meter_Reading = getArray_Meter_Reading; 
    MeterName = new ArrayList<String>(); 
    PreviousReading = new ArrayList<String>(); 

    for (int i = 0; i < getArray_Meter_Reading.length(); i++) { 
     try { 
      String Meter_Name = getArray_Meter_Reading.getJSONObject(i) 
        .getString("MeterName").toString(); 
      String previous_Meter_Reading = getArray_Meter_Reading 
        .getJSONObject(i).getString("PrevMeterReading") 
        .toString(); 
      MeterName.add(Meter_Name); 
      PreviousReading.add(previous_Meter_Reading); 

      // Meter[i]=MeterName.get(i); 
      // Previous[i]=PreviousReading.get(i); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    // initialize myList 
    for(int i=0;i<JSON_ARRAY_LENGTH;i++) 
    { 
     myList.put(i,""); 
    } 
} 

public int getCount() { 

    return getArray_Meter_Reading.length(); 
} 

public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    final int pos=position; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.meter_reading_list, null); 
     holder = new ViewHolder(); 
     holder.adp_MeterName = (TextView) convertView 
       .findViewById(R.id.txt_Meter_Name); 
     holder.adp_Previous = (TextView) convertView 
       .findViewById(R.id.txt_Previous); 
     holder.adp_Current = (EditText) convertView 
       .findViewById(R.id.ed_Current); 


     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.adp_Current.addTextChangedListener(new TextWatcher() { 

      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 

      } 

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

      } 

      public void afterTextChanged(Editable s) { 

       Current[holder.ref] = s.toString(); 
       myList.put(pos,s.toString.trim()); 
      } 
     }); 
    holder.ref = position; 
    holder.adp_MeterName.setText(MeterName.get(position)); 
    holder.adp_Previous.setText(PreviousReading.get(position)); 
    // holder.adp_Current.setHint(MeterName.get(position)); 

    // holder.adp_Current.setText(PreviousReading.get(position)); 

    holder.adp_Current.setText(myList.get(position)); 

    return convertView; 
} 

class ViewHolder { 
    TextView adp_MeterName, adp_Previous; 
    EditText adp_Current; 
    int ref; 

} 

} 

Qui ho inserito un oggetto HashMap che tenere d'occhio se EditText contiene il valore o not.and quando si scorre il listview, sarà reso nuovamente chiamando il suo metodo getView insieme al testo associato a ciascun edittext.

In questo codice, quando si carica per la prima volta listview, tutto il proprio edittoxt non avrà testo. Una volta inserito del testo, verrà annotato in myList.So quando si renderà nuovamente l'elenco, il testo verrà prevenuto.

Un'altra cosa, è necessario implementare il textwatcher all'esterno se (convertView == null) .. else .. block.That è una pratica migliore!

+0

ciò che è diverso in esso? –

+0

hai esaminato il codice che ho suggerito? contiene un oggetto HashMap there.go prima attraverso il codice! – Hiral

+1

il problema che devo affrontare è quando digiti un valore in 1st edittext e scendo verso la lista, il valore in 1st edittext è mostrato in qualche altra finestra di edittext. posso dare una soluzione per questo problema con questo problema negli ultimi tre giorni. –

9

Avevo lo stesso identico problema con un progetto su cui stavo lavorando. Tutte le soluzioni che ho trovato hanno menzionato anche l'utilizzo dello textChangeListener, tuttavia a causa della natura dell'elenco e con un EditText in ogni visualizzazione di riga, questo era molto inefficiente. Ho adottato un approccio separato utilizzando EditText.setOnFocusChangeListener().

L'ho allegato a ogni EditText all'interno del metodo getView. Il motivo per cui funziona così bene è che viene chiamato quando l'utente passa a un altro editatext o scorre in modo tale che la riga corrente non si trovi sullo schermo, causando la perdita dello stato di EditText.

Nel onFocusChange (Visualizza v, booleano hasFocus) entro l'ascoltatore ho semplicemente messo:

if (!hasFocus) { 
       EditText et = (EditText) v.findViewById(R.id.groupAmount);     
       data.get(position).put("dueAmount", et.getText().toString().trim()); 
      } 

Nel mio esempio sto memorizzazione del valore immesso nei miei dati utilizzata per popolare il punto di vista su ogni chiamata GetView, ma questo dovrebbe comunque mostrare come accedere ai dati inseriti dall'utente. Assicurati di provare a prendere questi dati memorizzati e prova a popolare il testo edit nella posizione corrispondente.

Spero che questo aiuti.

Distacco il mio adattatore completo qui per riferimento

public class memberlistadapter extends BaseAdapter { 
private LayoutInflater mInflater; 
public ArrayList<Hashtable<String, String>> data; 
ViewHolder viewHolder; 
public static HashMap<Integer,String> myList=new HashMap<Integer,String>(); 

public memberlistadapter(Context context) { 
    mInflater = LayoutInflater.from(context); 
} 

public memberlistadapter(Activity activity, ArrayList<Hashtable<String, String>> objects) { 
    super(); 
    mInflater = activity.getLayoutInflater(); 
    //this.activity = activity; 
    this.data = objects; 
    Log.d("data", data.toString()); 
} 

public void clear() { 
    this.data.clear(); 
    viewHolder = null; 
} 

public void setData(ArrayList<Hashtable<String, String>> data) { 
    this.data = data; 
} 

public int getCount() { 
    return data.size(); 
} 

public Object getItem(int item) { 
    return data.get(item); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.member_amount_child, null); 
     viewHolder = new ViewHolder(); 

     viewHolder.nameText = (TextView) convertView.findViewById(R.id.grp_amt_child); 
     viewHolder.amountText = (EditText) convertView.findViewById(R.id.groupAmount); 
     viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.memberCheckNotif); 

     convertView.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    //Log.d("data at "+position, data.get(position).toString()); 
    String amt = data.get(position).get("dueAmount"); 
    String name = data.get(position).get("name"); 
    String check = data.get(position).get("reminder"); 

    viewHolder.nameText.setText(name); 
    try { 
    if (amt.length() > 0 && !amt.equalsIgnoreCase("0")) { 
     viewHolder.amountText.setText(amt); 
    } else { 
     viewHolder.amountText.setText(""); 
    } 
    } catch (Exception e) { 
     viewHolder.amountText.setText(""); 
    } 

    viewHolder.amountText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       EditText et = (EditText) v.findViewById(R.id.groupAmount); 
       data.get(position).put("dueAmount", et.getText().toString().trim()); 
      } 
     } 
    }); 

    try { 
    if (check.equalsIgnoreCase("true")) { 
     viewHolder.checkBox.setChecked(true); 
    } else { 
     viewHolder.checkBox.setChecked(false); 
    } 
    } catch (Exception e) { 
     viewHolder.checkBox.setChecked(false); 
    } 
    viewHolder.checkBox.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      if (((CheckBox) v).isChecked()) { 
       data.get(position).put("reminder", "True"); 
      } else { 
       data.get(position).put("reminder", "False"); 
      } 
     } 
    }); 
    if (position == 0) { 
     viewHolder.checkBox.setVisibility(View.GONE); 
     viewHolder.amountText.setVisibility(View.GONE); 
     viewHolder.nameText.setVisibility(View.GONE); 
    } else { 
     viewHolder.checkBox.setVisibility(View.VISIBLE); 
     viewHolder.amountText.setVisibility(View.VISIBLE); 
     viewHolder.nameText.setVisibility(View.VISIBLE); 
    } 

    return convertView; 
} 

static class ViewHolder { 
    TextView nameText; 
    EditText amountText; 
    CheckBox checkBox; 
} 
} 
+3

questo non risolve il problema. Se si inserisce del testo in un testo di modifica e si scorre, il primo testo di modifica non perde la messa a fuoco e l'immissione viene persa. – kiduxa

+0

@kiduxa Usa 'addTextChangedListener' invece di' setOnClickListener' per EditText e metti 'vendorList.get (position) .put (" preference ", et_preference.getText(). ToString(). Trim());' in ** afterTextChanged ** –

Problemi correlati