Элементы Android RecyclerView StaggeredGrid меняют положение при прокрутке

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

Мой макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="1sp"
    >


        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/network_image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop" />

        <TextView
            android:id="@+id/url"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:visibility="gone" />


        <TextView
            android:id="@+id/author"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:visibility="gone"
            android:padding="8dp" />

        <TextView
            android:id="@+id/subreddit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/network_image"
            android:visibility="gone"
            android:text="New Text" />

        <TextView
            android:id="@+id/article_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/card_view"
            android:layout_alignStart="@+id/card_view"
            android:layout_below="@+id/author"
            android:visibility="gone"
            android:text="New Text" />

</LinearLayout>

Я отключил видимость текста, потому что я думаю, что изображение — это то, что продолжает перемещать объекты. Можно ли как-то исправить эту взаимозаменяемость элементов?

Код адаптера:

public class MyRecyclerAdapter extends RecyclerView.Adapter<ListViewRowHolder> {

private List<ListItems> listItemsList;
private Context mContext;
private ImageLoader mImageLoader;
private int focusedItem = 0;
String[] urls = {"http://i.telegraph.co.uk/multimedia/archive/03020/ANIMALS_GOOSE_3020723k.jpg","http://www.evolo.us/wp-content/uploads/2014/01/New-York-Vertical-Central-Park-Jeffrey-Lee-Rui-Liu-Tina-Qiu-01.jpg"};

public MyRecyclerAdapter(Context context,List<ListItems> listItemsList,ImageLoader imageLoader){
    this.listItemsList = listItemsList;
    this.mContext = context;
    this.mImageLoader = imageLoader;
}

@Override
public ListViewRowHolder onCreateViewHolder(final ViewGroup viewGroup, final int position){
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
    ListViewRowHolder holder = new ListViewRowHolder(v);


    holder.relativeLayout.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            TextView redditUrl = (TextView) v.findViewById(R.id.url);
            String postUrl = redditUrl.getText().toString();
            Intent intent = new Intent(mContext, WebViewActivity.class);
            intent.putExtra("url", postUrl);
            mContext.startActivity(intent);
        }
    });

    return holder;
}

@Override
public void onBindViewHolder(final ListViewRowHolder listViewRowHolder, int position) {
    ListItems listItems = listItemsList.get(position);
    listViewRowHolder.itemView.setSelected(focusedItem == position);

    listViewRowHolder.getLayoutPosition();

    Random rand = new Random();
    int n = rand.nextInt(2);

    Log.d("photos",listItems.getThumbnail()+" "+ listItems.getUrl());

    listViewRowHolder.thumbnail.setImageUrl(urls[n], mImageLoader);
    listViewRowHolder.thumbnail.setDefaultImageResId(R.drawable.image1);

    listViewRowHolder.title.setText(Html.fromHtml(listItems.getTitle()));
    listViewRowHolder.subreddit.setText(Html.fromHtml(listItems.getSubreddit()));
    listViewRowHolder.author.setText(Html.fromHtml(listItems.getAuthor()));
    listViewRowHolder.url.setText(Html.fromHtml(listItems.getUrl()));
}

public void clearAdapter(){
    listItemsList.clear();
    notifyDataSetChanged();
}

@Override
public int getItemCount(){
    return (null != listItemsList ? listItemsList.size() : 0);
}


}

person Bogdan Daniel    schedule 04.11.2015    source источник
comment
Возможный дубликат StaggeredGridLayoutManager и движущихся элементов   -  person YLS    schedule 26.04.2016


Ответы (2)


Тут уже ответили:

StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
recyclerView.setLayoutManager(manager);

Android — расположение элементов StaggeredGrid и в проекте github Picasso/Glide-RecyclerView-StaggeredGridLayoutManager

person YLS    schedule 21.04.2016

Вместо того, чтобы снова и снова создавать объект загрузчика изображений, создайте объект в конструкторе адаптера и используйте этот

listViewRowHolder.thumbnail.setImageUrl(urls[n], mImageLoader);

в onBindViewHolder и почему вы используете случайный, чтобы получить URL-адрес, используйте фиксированный URL-адрес и используйте позицию, чтобы получить это

Надеюсь, это решит вашу проблему

person Vennila    schedule 05.11.2015
comment
urls - это просто массив строк с двумя элементами в нем. Я использую random, чтобы вернуть 0 или 1. Это не настоящие URL-адреса. Вы можете посмотреть на первые строки и увидеть, что там это определено. - person Bogdan Daniel; 05.11.2015
comment
И я добавил ImageLoader в конструктор, но ничего не изменилось - person Bogdan Daniel; 07.11.2015