Повторяющиеся элементы с SimpleCursorAdapter - PullRequest
0 голосов
/ 31 августа 2018

Я заполняю DialogFragment элементами из Cursor , которые я передаю в SimpleCursorAdapter .

Проблема: Я получаю дублированные элементы, даже если в базе данных SQLite элементы не дублируются

Некоторая информация:

  1. compileSdkVersion 27
    buildToolsVersion "27.0.3"
  2. Я тестировал проблему в Android API 18 и 23
  3. Я использовал библиотеки поддержки 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);
    }
}

Есть идеи, как решить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...