Мое приложение загружает данные из базы данных SQLite и загружает их в EditText внутри Listview. Всякий раз, когда я меняю значение редактируемого текста и прокручиваю список вниз, EditText возвращается к исходному значению, полученному из базы данных. Есть ли способ предотвратить это. Я поискал в Интернете ответ, но не смог его найти. Любая помощь будет принята с благодарностью.
public class ExerciseAdapter extends CursorAdapter {
Context context;
public ExerciseAdapter(Context context, Cursor c) {
super(context, c, 0);
this.context = context;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.list_item_exercise, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
int nameCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.EXERCISE_NAME);
String name = cursor.getString(nameCol);
int weightCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.WEIGHT);
int weightInt = cursor.getInt(weightCol);
String weight = String.valueOf(weightInt);
int repCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.REPS);
int repsInt = cursor.getInt(repCol);
String reps = String.valueOf(repsInt);
int rpeCol = cursor.getColumnIndex(WorkoutContract.WorkoutEntry.RPE);
int rpeInt = cursor.getInt(rpeCol);
String rpe = String.valueOf(rpeInt);
EditText exerciseName = (EditText) view.findViewById(R.id.exercise_name_table);
exerciseName.setText(name);
EditText exerciseWeight = (EditText) view.findViewById(R.id.exercise_weight_table);
exerciseWeight.setText(weight);
EditText exerciseReps = (EditText) view.findViewById(R.id.exercise_reps_table);
exerciseReps.setText(reps);
EditText exerciseRpe = (EditText) view.findViewById(R.id.exercise_rpe_table);
exerciseRpe.setText(rpe);
}
}
public class ExerciseActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private ExerciseAdapter adapter;
Uri exerciseUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
ListView listView = findViewById(R.id.list);
Intent intent = getIntent();
exerciseUri = intent.getData();
adapter = new ExerciseAdapter(this, null);
listView.setAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projections = {
WorkoutContract.WorkoutEntry._ID,
WorkoutContract.WorkoutEntry.DAY_ID,
WorkoutContract.WorkoutEntry.EXERCISE_NAME,
WorkoutContract.WorkoutEntry.WEIGHT,
WorkoutContract.WorkoutEntry.REPS,
WorkoutContract.WorkoutEntry.RPE
};
return new CursorLoader(
this,
exerciseUri,
projections,
null,
null,
null
);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
Значит, вы не поняли там ответов. У всех видов адаптера есть свойство Recycling. Как только ваше представление выходит за пределы AdapterView, оно перерабатывается и создается снова, когда доступно для отображения на экране во время прокрутки. Вам нужно сохранить текст во время прокрутки. На мой взгляд, я бы не стал использовать EditText внутри ListView и поищу другой подход (MayBe может вводить данные с помощью диалога).
@ADM Спасибо, что объяснили, я еще раз посмотрю! Спасибо!




Вы можете добавить прослушиватель onFocusChanged для EditText, и если фокус не на EditText, обновите БД или сохраните значение для последующего извлечения.
Что-то вроде: -
et_childname.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b) {
Child c = (Child) view.getTag();
c.setName(et_childname.getText().toString());
((MainActivity)mActivity).changedChild(c);
}
}
});
b равен true, если EditText имеет фокус, иначе false (отсюда и проверка).
@ADM Я видел этот пост, когда пытался исследовать свою проблему, но я не нашел этот ответ применимым к моему сценарию.