2012-07-05 3 views
0

SimpleCursorAdapter을 사용하는 간단한 ListActivity이 있습니다. 사용자가 EditText을 사용하여 값 중 하나를 변경할 수 있습니다. 입력 한 숫자가 100 미만인지 확인하기 위해 간단한 유효성 검사를 수행합니다. 사용자가 입력 한 값이 유효성 검사에 실패하면 이전 값을 되돌리고 싶습니다.Android SimpleCursorAdapter getView 이전 값을 다시 저장하는 방법

몇 가지 방법을 시도했습니다. 내 현재 접근 방식은 데이터베이스에서 다시 쿼리하는 것이지만 작동하지 않습니다. 항상 변경된 값과 관계없이 ListActivity의 마지막 항목과 연관된 값을 항상 가져옵니다. 나는 LogCat에서 onTextChangedafterTextChanged이 변경된 행뿐만 아니라 ListActivity의 각 행에 대해 여러 번 실행된다는 것을 알았습니다. 난 정말이에 대한 신선한 관점을 이해할 것

public class MySimpleCursorAdapter extends SimpleCursorAdapter { 

    Context lcontext; 
    boolean changed; 
    String lastval; 

    private PortfolioData pfdata; 

    public MySimpleCursorAdapter(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     lcontext = context; 
    } 

    @Override 
    public View getView(final int pos, View v, ViewGroup parent) { 

     v = super.getView(pos, v, parent); 
     final EditText et = (EditText) v.findViewById(R.id.classpercentage); 

     final TextView tv = (TextView) v.findViewById(R.id._id); 
     et.addTextChangedListener(new TextWatcher() { 
      public void afterTextChanged(Editable s) { 
       Log.d("TEST", "In afterTextChanged s=" + s.toString() + " " 
        + tv.getText() + " POS = " + Integer.toString(pos)); 

       lastval = tv.getText().toString(); 


       if (changed == true) { 
        String enteredValue = s.toString(); 
        if (checkNullValues(enteredValue)) { 
         if (Float.parseFloat(enteredValue.trim()) > 100.0f) { 


          AlertDialog.Builder builder = new AlertDialog.Builder(
           lcontext); 

          builder.setMessage("Percentage Value should be Less than 100"); 

          builder.setPositiveButton("Ok", 
           new DialogInterface.OnClickListener() { 
            public void onClick(
             DialogInterface arg0, int arg1) { 

             String sql = "select c.percentage as PERCENTAGE " + 
             "from asset_classes c WHERE c._id = " + lastval + ";"; 

             pfdata = new PortfolioData(lcontext); 
             SQLiteDatabase db = pfdata.getReadableDatabase(); 

             Cursor cursor = db.rawQuery(sql, null); 

             if (cursor != null) 
             { 
              cursor.moveToFirst(); 

              et.setText(cursor.getString(0)); 
             } 

             cursor.close(); 
             pfdata.close(); 
            } 
           }); 
          // End of the Alert 

          if (changed == true) 
          { 
           builder.show(); 
          } 
         } 
        } 
        changed = false; 
       } 


      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
       // Log.d("TEST", "In beforeTextChanged start=" + 
       // Integer.toString(start) +" count="+ Integer.toString(count) + 
       // " after=" + Integer.toString(after) + " s=" + s + " " + tv); 
      } 

      public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
       Log.d("TEST", "In onTextChanged start=" + 
        Integer.toString(start) + " count=" + Integer.toString(count) 
        + " before=" + Integer.toString(before) + " s=" + s + " " + 
        tv); 
       changed = true; 

      } 
     }); 

     return v; 
    } 
} 

:

여기에 코드입니다. 언제나처럼, 미리 감사드립니다.

답변

0

onFocusChangeListener를 사용해보십시오. 포커스가 생기면 현재 텍스트를 클래스 필드에 저장하십시오. 같은

뭔가 :

String oldText - Would be your old text field.

그런 다음 당신이 할 : 수> 100

et.setOnFocusChangeListener(new OnFocusChangeListener()) { 
      @Override 
      public void onFocusChange(View whatever, boolean hasFocus) { 
         if (hasFocus) { 
         //code 
         } else { 
         //code or maybe empty 
         } 
      } 
}

그런 경우 그냥 oldText 값을 얻고 글고 치기에 넣어.

0

당신은 ListView에서 재활용을 알지 못한다고 생각합니다. Cursor에 1000 개의 행이있을 경우 생성 된 행 뷰는 10-20 (화면 크기에 따라 다름)입니다.
보기에 데이터를 저장하지 마십시오! beggining에서

난 당신이 http://commonsware.com/Android/excerpt.pdf

+0

당신이 올바른지 읽을 것을 권장합니다. 나는 listview 재활용에 대해 많이 알지 못했으며 링크 된 pdf는 정말 좋은 독서였습니다. 현재 소유하고있는 책보다 더 좋은 안드로이드 리소스입니다. 현재 재활용을 고려하여 게시 한 코드 섹션을 개정하고 있습니다. 이 섹션에서 보지 못한 것은 afterTextChanged, beforeTextChanged 또는 onTextChanged 핸들러에 대한 참조입니다. – Clavijo

+0

TextWatcher는 세부 사항입니다. 뷰가 데이터를 저장하는 데 사용되지 않는다는 것을 알게되면 트랜잭션과 같아야한다는 것을 알게됩니다. EditText의 데이터가 ok이면 콜렉션에 저장되고, 그렇지 않으면 EditText의 값이 콜렉션의 데이터로 겹쳐 쓰여집니다. – pawelzieba