2012-02-17 36 views
10

Tôi có mục danh sách với EditText trong đó, tôi không biết có bao nhiêu mục sẽ có. Tôi gặp sự cố khi nhập một số văn bản trong EditText và sau đó cuộn xuống ListView, sau khi tôi cuộn lên lần nữa, không có văn bản nào trong số EditText đầu tiên của tôi hoặc có một số văn bản từ EditText từ ListView.Android: EditText mất nội dung khi cuộn trong ListView?

Tôi đã thử TextWatcher và lưu dữ liệu vào mảng, nhưng vấn đề là vị trí được trả về trong ListView không phải lúc nào cũng đúng, vì vậy tôi đã mất một số dữ liệu từ mảng.

Vui lòng trợ giúp.

Đây là mã của tôi:

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; 

    } 

} 

Trả lời

8

thử điều này:

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; 

} 

} 

Ở đây tôi đã bao gồm một đối tượng HashMap mà sẽ giữ một mắt trên nếu EditText chứa giá trị hoặc not.And khi bạn di chuyển listview, nó sẽ được trả lại bằng cách gọi phương thức getView của nó cùng với văn bản được liên kết với mỗi văn bản.

Trong mã này, khi bạn tải danh sách lần đầu tiên, tất cả văn bản của bạn sẽ không có văn bản. Khi bạn nhập một số văn bản, nó sẽ được ghi chú trong myList.So khi bạn lại hiển thị danh sách, văn bản của bạn sẽ bị ngăn chặn.

Một điều nữa, bạn nên triển khai trình soạn thảo văn bản bên ngoài nếu (convertView == null) .. else .. block.Đó là phương pháp hay hơn!

+0

gì là khác nhau trong đó? –

+0

bạn đã xem mã tôi đề xuất chưa? nó chứa một đối tượng HashMap ở đó. Xem qua mã đầu tiên! – Hiral

+1

Tôi gặp vấn đề gì khi nhập một số giá trị trong edittext thứ nhất và tôi cuộn xuống danh sách, giá trị trong edittext thứ nhất được hiển thị là một số hộp văn bản khác. plz có thể cung cấp cho các giải pháp cho rằng im phải đối mặt với vấn đề này từ ba ngày qua. –

9

Tôi đã gặp sự cố tương tự với dự án mà tôi đang thực hiện. Tất cả các giải pháp tôi đã tìm thấy cũng được đề cập bằng cách sử dụng textChangeListener, tuy nhiên do tính chất của danh sách, và với một EditText trong mỗi lần xem hàng, điều này rất không hiệu quả. Tôi đã thực hiện một cách tiếp cận riêng biệt bằng cách sử dụng EditText.setOnFocusChangeListener().

Tôi đã đính kèm điều này vào mỗi EditText trong phương thức getView. Lý do này hoạt động rất tốt là nó được gọi khi người dùng chuyển sang một văn bản hoặc các cuộn khác nhau để hàng hiện tại tắt màn hình làm cho EditText mất tiêu điểm.

Trong onFocusChange (Xem v, boolean hasFocus) trong người nghe tôi chỉ cần đặt:

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

Trong ví dụ của tôi, tôi đang lưu trữ các giá trị nhập vào dữ liệu của tôi sử dụng để cư trú quan điểm trên mỗi cuộc gọi getView, nhưng điều này vẫn sẽ hiển thị cách truy cập dữ liệu mà Người dùng đã nhập. Chỉ cần đảm bảo bạn cố gắng lấy dữ liệu được lưu trữ này và thử điền vào editText ở vị trí tương ứng.

Hy vọng điều này sẽ hữu ích.

gửi bài adaptor đầy đủ của tôi ở đây để tham khảo

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

điều này không giải quyết được vấn đề gì cả. Nếu bạn đặt một số văn bản trên Chỉnh sửa văn bản và sau đó cuộn, văn bản chỉnh sửa đầu tiên không mất tiêu điểm và đầu vào bị mất. – kiduxa

+0

@kiduxa Sử dụng 'addTextChangedListener' thay vì' setOnClickListener' cho EditText và đặt 'vendorList.get (position) .put (" preferences ", et_preference.getText(). ToString(). Trim());' in ** afterTextChanged ** –

Các vấn đề liên quan