StaggeredGridView меняет размеры элементов при прокрутке

я столкнулся с этой проблемой

Я использую представление сетки в шахматном порядке, и оно имеет комбинацию двух столбцов и одиночных столбцов. Что-то вроде этого

введите здесь описание изображения

все работает нормально, пока я несколько раз не прокручиваю вверх и вниз, и он случайным образом не меняется на что-то вроде этого

введите здесь описание изображения

Еще несколько свитков и вот так

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

Это код моей приборной панели

public class DashboardStaggered extends Fragment {
    RecyclerView mRecyclerView;
    View v;
    MasonryAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("MASONRY", "onCreateView");
        super.onCreate(savedInstanceState);
        if(v==null) {
            Log.d("MASONRY", "v is NULL recreating");
            v = inflater.inflate(R.layout.activity_dashboard_staggered, container, false);
            setupRecyclerView();
        }else{
            Log.d("MASONRY", "v is NOT NULL");

        }

        return v;
    }

    private void setupRecyclerView(){
        mRecyclerView = (RecyclerView) v.findViewById(R.id.masonry_grid);
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        adapter = new MasonryAdapter(getActivity(),this);
        mRecyclerView.setAdapter(adapter);
        SpacesItemDecoration decoration = new SpacesItemDecoration(12);
        mRecyclerView.addItemDecoration(decoration);
        adapter.notifyDataSetChanged();

    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("MASONRY", "onResume");
        if(mRecyclerView==null) {
            setupRecyclerView();
        }



    }
    @Override
    public void onPause() {
        super.onPause();
        Log.d("MASONRY", "onPause");

    }

}

Если нужно, могу и адаптер выложить. Любые предложения высоко ценятся, ребята.

Код адаптера здесь (не хочу загромождать пост) http://pastebin.com/QkZbjjp1

Урезанный код http://pastebin.com/Hgsji1RG


person Veeru    schedule 11.01.2016    source источник
comment
Покажите код адаптера пожалуйста. Если вы выполняете какие-либо фоновые операции, которые могут быть виновниками.   -  person Jason Robinson    schedule 11.01.2016
comment
Добавлено в сообщение Джейсон, пожалуйста, посмотрите   -  person Veeru    schedule 11.01.2016
comment
Извините, мне слишком сложно разобрать, что там происходит.   -  person Jason Robinson    schedule 11.01.2016
comment
Json, урезаны несвязанные фрагменты кода. Спасибо   -  person Veeru    schedule 11.01.2016
comment
Я не знаю, является ли это проблемой, но одна из возможных причин находится в строке 77, вы должны использовать метод getItemViewType, так как это метод, который определяет типы представлений.   -  person Jason Robinson    schedule 11.01.2016
comment
Как упоминалось в комментарии Джейсона, я также думаю, что проблема в вашем методе getItemViewType(). Вы не обрабатываете ViewType в зависимости от позиции, вы просто меняете тип для первой (позиция 0) и последней (позиция 11), но для остальных позиций вы используете тот же тип TILE_TYPE_ONE_COLUMN__TILE .   -  person Rami    schedule 11.01.2016
comment
Эй, Джейсон, не уверен, что ты имеешь в виду? Вы можете помочь мне здесь?   -  person Veeru    schedule 11.01.2016
comment
вы пропускаете строку и столбец для каждого элемента   -  person Thanh Le    schedule 11.01.2016
comment
Я думаю, что вижу это. Позвольте мне попробовать, ребята   -  person Veeru    schedule 11.01.2016
comment
Да, это действительно была проблема. Я совсем пропустил, спасибо, что указали на это. Должен ли я сам ответить на свой вопрос, или кто-то возьмет на себя эту честь? :)   -  person Veeru    schedule 11.01.2016
comment
Возможный дубликат StaggeredGridLayoutManager и движущихся элементов   -  person YLS    schedule 26.04.2016


Ответы (2)


Как Джейсон упомянул в комментариях, это была ошибка в itemgetviewtype, логическая ошибка больше, чем что-либо еще. Но урок извлечен, обновленный код для getItemViewType

@Override
    public int getItemViewType(int position) {
        // Return type based on position
        return tileDefinitions.get(position).getTileType();
    }

Спасибо всем, что указали на это.

person Veeru    schedule 12.01.2016

Это происходит потому, что держатель не распознает ширину и высоту изображения при прокрутке вверх и вниз. Он очищает верхний вид при прокрутке вниз и наоборот.

Используйте так:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

    MyViewHolder vh = (MyViewHolder) viewHolder;
    ImageModel item = imageModels.get(position);
    RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) vh.imageView.getLayoutParams();
    float ratio = item.getHeight() / item.getWidth();
    rlp.height = (int) (rlp.width * ratio);
    vh.imageView.setLayoutParams(rlp);
    vh.positionTextView.setText("pos: " + position);
    vh.imageView.setRatio(item.getRatio());
    Picasso.with(mContext).load(item.getUrl()).placeholder(PlaceHolderDrawableHelper.getBackgroundDrawable(position)).into(vh.imageView);
}

Для очистки см. эту ссылку: Picasso/Glide-RecyclerView-StaggeredGridLayoutManager

person YLS    schedule 21.04.2016