Я заполняю DialogFragment элементами из Cursor , которые я передаю в SimpleCursorAdapter .
Проблема: Я получаю дублированные элементы, даже если в базе данных SQLite элементы не дублируются
Некоторая информация:
- compileSdkVersion 27
buildToolsVersion "27.0.3"
- Я тестировал проблему в Android API 18 и 23
- Я использовал библиотеки поддержки Android v7: 25.0.1 и 27.1.1
Это мой код:
public class ServiceCodifiedResultDialog extends DialogFragment implements
DialogInterface.OnClickListener, ViewBinder, LoaderManager.LoaderCallbacks<Cursor> {
private static final String EXTRA_SERVICE_INFO = "EXTRA_SERVICE_INFO";
private static final String STATE_CODIFIED_RESULT = "STATE_CODIFIED_RESULT";
private static final String STATE_SERVICE_INFO = "STATE_SERVICE_INFO";
private static final int LOADER_SERVICE_RESULTS_ID = 0;
private int mCodifiedResult;
private ServiceInfo mServiceInfo;
private SimpleCursorAdapter mListAdapter;
private OnServiceListener mOnServiceListener;
public static ServiceCodifiedResultDialog newInstance(ServiceInfo serviceInfo) {
Bundle arguments = new Bundle(1);
arguments.putSerializable(EXTRA_SERVICE_INFO, serviceInfo);
ServiceCodifiedResultDialog fragment = new ServiceCodifiedResultDialog();
fragment.setArguments(arguments);
return fragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mOnServiceListener = (OnServiceListener) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mServiceInfo = (ServiceInfo) savedInstanceState.getSerializable(STATE_SERVICE_INFO);
mCodifiedResult = savedInstanceState.getInt(STATE_CODIFIED_RESULT, -1);
} else {
mServiceInfo = (ServiceInfo) getArguments().getSerializable(EXTRA_SERVICE_INFO);
mCodifiedResult = -1;
}
mListAdapter = new SimpleCursorAdapter(getActivity(), R.layout.row_dialog_service_result,
null,
new String[]{ServiceResults.COLUMN_NAME_DESCR},
new int[]{
R.id.id_codified_result_descr
}, 0);
mListAdapter.setViewBinder(this);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
/* creat a dialog with SingleChoice List */
AlertDialog dialog = new AlertDialog.Builder(
new ContextThemeWrapper(getActivity(), R.style.DialogApptheme))
.setIcon(R.drawable.services)
.setTitle(R.string.dialog_title)
.setPositiveButton(R.string.btn_ok, this)
.setNegativeButton(R.string.btn_cancel, this)
.setSingleChoiceItems(mListAdapter, -1, this).create();
return dialog;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_SERVICE_RESULTS_ID, null, this);
}
//continue below
Этот метод вызывается несколько раз с дублированными значениями, и я не знаю почему:
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if (view.getId() == R.id.id_codified_result_descr) {
TextView codifiedResultDescrTextView = (TextView) view;
String codifiedResultDescr = cursor.getString(columnIndex);
if (!cursor.isNull(columnIndex + 1)) {
codifiedResultDescr = String.format(Locale.getDefault(), "%1$s \u2013 %2$s",
cursor.getString(columnIndex + 1), codifiedResultDescr);
}
codifiedResultDescrTextView.setText(codifiedResultDescr);
return true;
}
return false;
}
Здесь методы onCreate, onFinished и onReset Loader:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
StringBuilder selection = new StringBuilder();
selection.append(ServiceResults.COLUMN_NAME);
selection.append("=").append(value);
StringBuilder sortOrder = new StringBuilder();
sortOrder.append(ServiceResults.COLUMN_NAME_DESCR).append(" ASC");
return new CursorLoader(getActivity(), ServiceResults.CONTENT_URI, new String[]{
String.format("%1$s AS %2$s", ServiceResults.COLUMN_NAME, ServiceResults._ID),
ServiceResults.COLUMN_NAME_DESCR,
ServiceResults.COLUMN_NAME_CODE
}, selection.toString(), null, sortOrder.toString());
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
int checkedPosition = -1;
int valueToCheck = mCodifiedResult == -1 && mServiceInfo.mCodifiedResult != null
? mServiceInfo.mCodifiedResult : mCodifiedResult;
while (valueToCheck >= 0 && cursor.moveToNext() && checkedPosition == -1) {
if (cursor.getInt(0) == valueToCheck) {
checkedPosition = cursor.getPosition();
}
}
mListAdapter.swapCursor(cursor);
if (checkedPosition >= 0) {
((AlertDialog) getDialog()).getListView().setItemChecked(checkedPosition, true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> cursor) {
mListAdapter.swapCursor(null);
}
}
Есть идеи, как решить проблему?