Элементы StaggeredGridLayoutManager в смежных столбцах меняются местами

Я использую StaggeredGridLayoutManager к макету Cardviewsгде каждая карта имеет кнопку, которая может расширять и сокращать карту, чтобы показать различную информацию. Карты выложены в две колонки вертикально по экрану. Карты подкреплены RealmObject и я использую RealmRecyclerViewAdapter чтобы выложить их в поле зрения переработчика, но я не думаю, что это проблема.

Когда я нажимаю на кнопку, которая вызывает onBindViewHolder() чтобы быть вызванным, иногда мои карты поменяются местами через колонки. Меняются только карты в соседних столбцах, и я могу показать это, увеличив количество столбцов до трех или четырех и наблюдая за их поведением. При изменении количества столбцов на один карты перестают обмениваться. Есть хорошая анимация, когда карты меняются друг с другом, но если я отключаю анимацию (recyclerView.setItemAnimator(null)) карты по-прежнему меняются местами просто без анимации.

Карты меняются только когда onBindViewHolder() вызывается, и это случается достаточно часто, чтобы быть очевидным, но я не могу воспроизвести функциональность, кажется, что это происходит случайно.

Вот некоторый код:

Фрагмент, отображающий RecyclerView:

public class DeviceCardListFragment extends Fragment {
    private RecyclerView recyclerView;
    private RealmResults<Bank> deviceList;

    public int locationId = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.card_list_fragment, container, false);

        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);

        //Turn off the blinking animation when the Realm Refreshes
        RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
        if (animator instanceof SimpleItemAnimator) {
            ((SimpleItemAnimator)animator).setSupportsChangeAnimations(false);
        }

        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        manager.setGapStrategy(GAP_HANDLING_NONE);

        recyclerView.setLayoutManager(manager);
        recyclerView.setAdapter(new StaggeredDeviceAdapter(getContext(), deviceList));
        recyclerView.setItemViewCacheSize(40);

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
}

StaggeredDeviceAdapter:

public class StaggeredDeviceAdapter extends RealmRecyclerViewAdapter<Bank, StaggeredDeviceViewHolder> {
    private RealmResults<Bank> devices;
    private Context context;

    public StaggeredDeviceAdapter(Context context, RealmResults<Bank> list) {
        super(list, true);
        this.devices = list;
        this.context = context;
    }

    @Override
    public StaggeredDeviceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(context).inflate(R.layout.device_card, null);

        //setHasStableIds(true);
        StaggeredDeviceViewHolder holder = new StaggeredDeviceViewHolder(layoutView);

        return holder;
    }

    @Override
    public void onBindViewHolder(StaggeredDeviceViewHolder holder, int position) {
        holder.setValues(devices.get(position), context);
    }
}

StaggeredDeviceViewHolder:

Я вытащил свою фактическую конфигурацию вида в другой класс для многократного использования, но я не думаю, что что-то там важно.

public class StaggeredDeviceViewHolder extends RecyclerView.ViewHolder {
    private View view;

    DeviceCardHolder holder;

    public StaggeredDeviceViewHolder(View view) {
        super(view);

        holder = new DeviceCardHolder(view, false);
        //holder.initialise();

        this.view = view;
    }

    //Called from outside the class
    //Sets all of the fields to whatever values we want
    public void setValues(Bank bank, Context context) {
        holder.initialise();
        holder.setValues(bank, context);
    }
}

Пожалуйста, дайте мне знать, если вы хотите любую другую информацию от меня.

РЕДАКТИРОВАТЬ: Добавление информации о царстве

 deviceList = realm.where(Bank.class).equalTo("locationSection",location).findAllSorted("locationID");

Ни одно из этих полей не изменяется в коде, на самом деле они даже не имеют установщиков. Поскольку область отсортирована, а карты меняются только вдоль горизонтальной оси, я думаю, что проблема в StaggeredGridLayoutManager а не царство.

РЕДАКТИРОВАТЬ: Благодаря дополнительному тестированию я смог надежно повторить проблему.

Я использую StaggeredGridLayoutManager потому что мои карты могут изменить размер. Это делается нажатием кнопки на карте. Развертывание и возврат карты к исходному размеру не вызывает onBindViewHolder() быть названным. Карты ниже тех, кто по размеру меняет своп столбцы, когда onBindViewHolder() вызывается после изменения размера одной из карточек. Карты не меняются каждый раз, но я бы сказал, что это происходит примерно в 80% случаев. Только карты прямо под теми, которыми я манипулирую позициями обмена. Это заставляет меня думать, что StaggeredGridLayoutManager запутывается, где его индексы должны быть, когда карты меняют размер, может быть, есть настройка для индексов, которые мне не хватает....

РЕДАКТИРОВАТЬ: проблема, которую я имею, в основном та же самая, изложенная в этом вопросе:

... но у него нет ответа

0 ответов

Другие вопросы по тегам