SimpleCursorAdapter
을 사용하는 간단한 ListActivity
이 있습니다. 사용자가 EditText
을 사용하여 값 중 하나를 변경할 수 있습니다. 입력 한 숫자가 100 미만인지 확인하기 위해 간단한 유효성 검사를 수행합니다. 사용자가 입력 한 값이 유효성 검사에 실패하면 이전 값을 되돌리고 싶습니다.Android SimpleCursorAdapter getView 이전 값을 다시 저장하는 방법
몇 가지 방법을 시도했습니다. 내 현재 접근 방식은 데이터베이스에서 다시 쿼리하는 것이지만 작동하지 않습니다. 항상 변경된 값과 관계없이 ListActivity
의 마지막 항목과 연관된 값을 항상 가져옵니다. 나는 LogCat
에서 onTextChanged
과 afterTextChanged
이 변경된 행뿐만 아니라 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;
}
}
:
여기에 코드입니다. 언제나처럼, 미리 감사드립니다.
당신이 올바른지 읽을 것을 권장합니다. 나는 listview 재활용에 대해 많이 알지 못했으며 링크 된 pdf는 정말 좋은 독서였습니다. 현재 소유하고있는 책보다 더 좋은 안드로이드 리소스입니다. 현재 재활용을 고려하여 게시 한 코드 섹션을 개정하고 있습니다. 이 섹션에서 보지 못한 것은 afterTextChanged, beforeTextChanged 또는 onTextChanged 핸들러에 대한 참조입니다. – Clavijo
TextWatcher는 세부 사항입니다. 뷰가 데이터를 저장하는 데 사용되지 않는다는 것을 알게되면 트랜잭션과 같아야한다는 것을 알게됩니다. EditText의 데이터가 ok이면 콜렉션에 저장되고, 그렇지 않으면 EditText의 값이 콜렉션의 데이터로 겹쳐 쓰여집니다. – pawelzieba