2016-07-06 21 views
5

Właśnie skończyłem RecyclerView dla mojego Android Application, ale podczas testowania znalazłem dziwny błąd, którego nie rozumiem. Po uruchomieniu działania elementy w widoku Recycler są umieszczone prawidłowo w odległości RecyclerView. Jednak po rozpoczęciu przewijania odsuwają się od siebie, aż tylko jeden element jest widoczny na raz, a przed wyświetleniem następnego elementu musisz przewinąć ekran distance almost equivalent do ekranu.Recycler Wyświetlenie spacji między elementami rozwijanymi podczas przewijania

Oto co bug wygląda następująco:

Przed przewijanie na aktywność lunchu

enter image description here

Po przewijanie recycleview

enter image description here

Jeśli masz jakiś pomysł, co może powodując to, każda pomoc będzie bardzo ceniona.

Oto kod RecyclerView z działalności:

private ArrayList<String> imagesUrlListThumb, imagesUrlListFull = new ArrayList<String>(); 
private RecyclerAdapter recyclerAdapter; 
private String urlRecyclerThumb = ""; 
private RecyclerView recyclerView; 
private ImageView imgCurRecyclerView; 

    imagesUrlListThumb = produit.getImgUrlThumbMul(); 
    recyclerAdapter = new RecyclerAdapter(getApplicationContext(), imagesUrlListThumb); 
    recyclerView = (RecyclerView) findViewById(R.id.content_product_detail_recycer_view); 
    RecyclerView.LayoutManager recyclerLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false); 
    recyclerView.setLayoutManager(recyclerLayoutManager); 
    recyclerView.setAdapter(recyclerAdapter); 
    urlRecyclerThumb = imagesUrlListThumb.get(0); 
    RecyclerItemClickSupport.addTo(recyclerView).setOnItemClickListener(new RecyclerItemClickSupport.OnItemClickListener() { 
     @Override 
     public void onItemClicked(RecyclerView rv, int pos, View view) { 
      urlRecyclerThumb = imagesUrlListThumb.get(pos); 
      Picasso.with(getApplicationContext()).load(urlRecyclerThumb).fit().into(imgCurRecyclerView); 
     } 
    }); 

adapter Recycler:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{ 

private List<String> urlThumbImg; 
private Context context; 

public RecyclerAdapter(Context ctx, List<String> urls){ 
    this.urlThumbImg = urls; 
    this.context = ctx; 
} 

@Override 
public RecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_slideshow, parent, false); 
    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(RecyclerAdapter.MyViewHolder holder, int position){ 
    String current = urlThumbImg.get(position); 
    Picasso.with(context).load(current).fit().into(holder.myImgView); 
} 

@Override 
public int getItemCount(){ 
    return urlThumbImg.size(); 
} 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public ImageView myImgView; 

    public MyViewHolder(View view){ 
     super(view); 
     myImgView = (ImageView) view.findViewById(R.id.imageView_slide); 
    } 
} 
} 

Oto mój układ xml dotycząca widok recykler:

<!-- RECYCLER VIEW --> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="15dp" 
     android:orientation="vertical"> 

     <ImageView 
      android:id="@+id/content_product_detail_recycer_view_cur_image" 
      android:layout_width="150dp" 
      android:layout_height="130dp" 
      android:layout_gravity="center" 
      android:background="@android:color/black" /> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/content_product_detail_recycer_view" 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:layout_gravity="center" 
      android:layout_margin="5dp" 
      android:background="@android:color/darker_gray"> 

     </android.support.v7.widget.RecyclerView> 

    </LinearLayout> 

układ dla pozycji wewnątrz recyclerview:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ImageView 
    android:id="@+id/imageView_slide" 
    android:layout_width="60dp" 
    android:layout_height="60dp" 
    android:layout_margin="5dp" 
    android:background="@android:color/darker_gray" /> 

+2

kod recyclerView? –

+0

Zapewnij układ dla ciebie przedmioty wewnątrz recyclerview i kod dla recyclerview – Kushan

+0

@AhmadAlsanie Dodałem kod moje pytanie –

Odpowiedz

8

Podaj swój układ i kod RecyclerView aby pomóc debugowania, a nie robić przypuszczenie.

Ok, więc tutaj jest problem:

Wraz z wydaniem 2.3.0 jest ekscytująca nowa funkcja API LayoutManager: automatyczny pomiar! Umożliwia to widokowi RecyclerView rozmiar w oparciu o rozmiar jego zawartości. Oznacza to, że możliwe są już wcześniej niedostępne scenariusze, takie jak użycie WRAP_CONTENT dla wymiaru RecyclerView. Znajdziesz wszystkie wbudowane w LayoutManagers teraz obsługuje automatycznego pomiaru.

W związku z tą zmianą, należy dokładnie sprawdzić parametry układu swoich poglądów produktu: wcześniej ignorowane parametrów układu (takie jak MATCH_PARENT w kierunku przewijania) będzie teraz w pełni przestrzegane.

Zasadniczo trzeba usunąć LinearLayout

<ImageView 
android:id="@+id/imageView_slide" 
android:layout_width="60dp" 
android:layout_height="60dp" 
android:layout_margin="5dp" 
android:background="@android:color/darker_gray" /> 

match_parent w szerokości LinearLayout powoduje każdą pozycję, aby zmieścić cały ekran z jednego obrazu i pozostałej przestrzeni.

Jeśli upierasz się przy użyciu LinearLayout ustawić wysokość i szerokość do wrap_content

+0

Wielkie dzięki za szczegółową odpowiedź, dałeś mi rozwiązanie i wyjaśnienie, więc doceniam to. Mam nadzieję, że to również uniemożliwi mi powtórzenie tego samego błędu, okrzyki! –

+2

src: http://stackoverflow.com/questions/35728179/recyclerview-items-with-big-empty-space-after-23-2-0 –

+0

dzięki @Ahmad Alsanie :) zapomniałem dodać źródła do cytatu:) – Kushan