2016-03-09 14 views
9

Mam problem z moim RecyclerView i jego elementami podrzędnymi. Nie rozciągają się one przez cały numer android:layout_width="match_parent" ani fill_parent. Próbowałem obu. Rzecz w tym, że ta praca doskonale i bez żadnych zmian, jakoś się zepsuła.Pozycja w RecyclerView nie wypełnia swojej szerokości match_parent

pokazuję to w FragmentDialog i elementy podrzędne poszerzyć tylko jak wrap_content kiedy przewijać widok w górę iw dół, są one w pełni rozwinięty, ale jak tylko kliknąć na nich (nazywam notifyDataSetChanged()) kurczą się one ponownie.

Oto zdjęcie prawidłowo wypełnionego przedmiotu, a poniżej jego sposób ich ładowania lub powiadomienia. Również użyty StickHeaderAdapter nie wyświetla nagłówków, dopóki nie kliknę jednego z elementów (poprzednio to zrobiłem i nic nie zmieniłem również w tej części).

recyclerview child problem

Oto kod dla wiersza dzieci:

<?xml version="1.0" encoding="utf-8"?> 
<carbon.widget.LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:carbon_rippleColor="@color/green" 
    app:carbon_rippleStyle="background"> 

<carbon.widget.TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/block_name" 
    android:padding="@dimen/block_row_padding" 
    android:layout_weight="1" 
    android:textSize="@dimen/block_row_text_size" 
    android:textColor="@color/black" 
    app:carbon_rippleColor="@color/green" 
    app:carbon_rippleStyle="background"/> 

<RelativeLayout 
    android:id="@+id/download_layout" 
    android:layout_width="64dp" 
    android:layout_height="match_parent" 
    android:layout_marginRight="24dp" 
    android:layout_marginEnd="24dp" 
    android:visibility="gone"> 


    <carbon.widget.ProgressBar 
     android:id="@+id/downloading_bar" 
     app:carbon_progressStyle="circular_indeterminate" 
     app:carbon_barWidth="5dp" 
     app:carbon_tint="@color/green" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_gravity="center" 
     android:layout_margin="8dp" 
     android:visibility="invisible"/> 

    <carbon.widget.TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/block_progress_download" 
     android:textSize="12sp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:visibility="invisible" /> 

</RelativeLayout> 

A oto część kodu adaptera gdzie tworzę ViewHolder:

@Override 
public BlockAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.block_row, parent, false); 
    return new ViewHolder(view); 
} 

Jest to kod wiążący, jeśli pomaga:

@Override 
public void onBindViewHolder(BlockAdapter.ViewHolder holder, int position) { 
    if (blockData.isDownloading()) { 
     holder.download_layout.setVisibility(View.VISIBLE); 
     holder.download_bar.setVisibility(View.VISIBLE); 
     if (blockData.getProgress() != null) { 
      holder.download_progress.setVisibility(View.VISIBLE); 
      holder.download_progress.setText(String.format("%d%%", blockData.getProgress())); 
     } 
    } else { 
     holder.download_layout.setVisibility(View.GONE); 
     holder.download_bar.setVisibility(View.GONE); 
     holder.download_progress.setVisibility(View.GONE); 
    } 

    if (selected) { 
     holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.green)); 
     holder.block_name.setTextColor(mContext.getResources().getColor(R.color.white)); 
    } else { 
     holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.white)); 
     holder.block_name.setTextColor(mContext.getResources().getColor(R.color.black)); 
    } 

} 

Nie wiem, dlaczego ta praca w godzinach porannych, a później zmienić ...

Czego próbowałem:

  • Zmień match_parent dla fill_parent
  • Ustaw RecyclerView.LayoutParams do LayoutParams.MATCH_PARENT
  • Zmiana szerokości programowo
  • Zmień createViewHolder z ..., parent, false); do ..., null); i dodać Params seperatelly
  • zalogowani szerokość (czasami jest to jak 390, kiedy przewijać dojdzie do 990, a gdy klikam z powrotem do 390)
  • konfiguracji StickHeaders szybciej, ale są wszystkie ustawione, gdy zostaną utworzone, a nagłówek tam jest, jest po prostu niewidoczny.

WSZYSTKIEGO POMOCY JEST NADAJĄCE SIĘ!

+1

Próbowałaś stosując normalną * * 'LinearLayout'? Nie mam pojęcia, co to jest 'carbon.widget.LinearLayout' lub co robi –

+0

Po prostu dodaje efekt marszczenia do klikania elementów. To działało wcześniej:/ – slorangex

+0

Cóż, robi to trochę niestandardowych pomiarów, więc nie w pełni mi w to ufał. Powinieneś spróbować, jeśli działa z normalnym układem. –

Odpowiedz

35

Problem dotyczy nowej biblioteki pomocy technicznej 23.2.0, więc zmieniono ją na 23.1.1 i działa poprawnie. Jeśli znajdę rozwiązanie lub co zmienić, dam ci znać, w przeciwnym razie zostawiam ten wątek otwarty, jeśli ktoś inny znajdzie lepszą odpowiedź.

UPDATE

Ok, więc postanowiłem, że nadszedł czas, aby rozwiązać ten problem, ponieważ musimy przenieść się do nowych bibliotek pomocniczych i ja w końcu znalazłem odpowiedź.

Problemem było/jest to, że nowy LayoutManager korzysta autoMeasure() i jakoś to wszystko zmieniło moje match_parent do wrap_content, więc tutaj jest to, co trzeba zrobić, jeśli napotkasz podobny problem.

Najpierw utwórz LinearLayoutManager llm = new LinearLayoutManager(getActivity());

następnie llm.setAutoMeasureEnabled(false);

i wreszcie ustawić LinearLayoutManager do RecyclerView, ale zrobić to POrecyclerView.setAdapter(yourAdapter);

Oto krótki przykład:

recyclerView.setAdapter(adapter); 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setAutoMeasureEnabled(false); 
recyclerView.setLayoutManager(llm); 
+0

Uważam, że to trochę śmieszne, że te błędy ".setLayoutManager()' i '.setAdapter()' istnieją –

+1

To działało dla mnie dzięki. Korzystam z RecyclerView 25.2.0 i ustawiam najpierw menedżera układu, a następnie setAutoMeasureEnabled (false), a następnie adapter, który zadziałał dzięki –

+0

. mi to pasuje. –

0

Aby Walkaround ten błąd zmieniłem:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()); 

z:

recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1)); 
Powiązane problemy