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>
Jakiej wersji recyrkulatora masz na gradle? – Diekrul
przy użyciu najnowszego 25.1.1 – Gak2
@ Gak2 Zastanawiałem się, czy znalazłeś rozwiązanie tego problemu, ponieważ mam teraz do czynienia z tym samym problemem. –