2017-02-16 10 views
11

Potrzebuję poziomego widoku RecyclerView. Jednak elementy w nich mają wysokość dynamiczną w oparciu o to, co zostało zwrócone z backendu.Poziome urządzenie recyklingoweWyświetl elementy o dynamicznej wysokości

RecyclerView i jej elementy mają wysokość „wrap_content”

Problemem jest to, że pierwsze widoczne elementy w RecyclerView są małe, wtedy gdy użytkownik przewija do większych przedmiotów, wydają odcięte.

Idealnie chcemy, aby RecyclerView był wystarczająco duży, aby pomieścić największy element w grupie (ale tylko największy istniejący element ... nie jest to hipotetycznie największy produkt). RecyclerView dynamicznie zmieniając swoją wysokość jest również do zaakceptowania.

Napisałem przykład aplikacji, aby zilustrować problem. W tej aplikacji mamy poziomą listę. Pierwsze 33 elementy powinny pokazywać 1 linię tekstu, podczas gdy następne powinny pokazywać 3 wiersze tekstu, a ostatnie 34 powinny pokazywać 2 linie. Jednak wszystkie one pokazują 1 linię, ponieważ wysokość okna RecyclerView nie zmienia się.

Próbowałem wywoływać requestLayout() na RecyclerView (i na TextView) z onBindViewHolder(), ale nie wydaje się nic.

główną działalność:

public class MainActivity extends AppCompatActivity { 

    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mAdapter = createAdapter(); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    private RecyclerView.Adapter<ViewHolder> createAdapter() { 
     RecyclerView.Adapter adapter = new RecyclerView.Adapter<ViewHolder>() { 
      @Override 
      public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
       return new ViewHolder(v); 
      } 

      @Override 
      public void onBindViewHolder(ViewHolder holder, int position) { 
       if (position < 33) { 
        holder.mText.setText("1 line"); 
       } else if (position > 66) { 
        holder.mText.setText("2 lines\n2 lines"); 
       } else { 
        holder.mText.setText("3 lines\n3 lines\n3 lines"); 
       } 
      } 

      @Override 
      public int getItemCount() { 
       return 100; 
      } 
     }; 
     return adapter; 
    } 

    private static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView mText; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      mText = (TextView) itemView.findViewById(R.id.text); 
     } 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</RelativeLayout> 

item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#888888"> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hi" 
     android:textSize="30sp" /> 

</LinearLayout> 
+0

Jakiej wersji recyrkulatora masz na gradle? – Diekrul

+0

przy użyciu najnowszego 25.1.1 – Gak2

+1

@ Gak2 Zastanawiałem się, czy znalazłeś rozwiązanie tego problemu, ponieważ mam teraz do czynienia z tym samym problemem. –

Odpowiedz

-2

Tylko cal l itemAdapter.notifyDataSetChanged();

+0

Czy możesz sformatować swój kod, podświetlając go i naciskając Ctrl + K – WhatsThePoint