Vì vậy, tôi cần một RecyclerView nằm ngang. Tuy nhiên, các mục trong chúng có chiều cao động dựa trên những gì được trả về từ chương trình phụ trợ.RecyclerView ngang với các mục có chiều cao động
Các RecyclerView và các mặt hàng của mình có chiều cao của "wrap_content"
Vấn đề là nếu các mặt hàng có thể nhìn thấy đầu tiên trong RecyclerView là nhỏ, sau đó khi người dùng cuộn đến các mục lớn hơn, họ xuất hiện cắt đứt.
Lý tưởng nhất là chúng tôi muốn RecyclerView đủ lớn để chứa mục lớn nhất trong nhóm (nhưng chỉ có mục lớn nhất hiện có ... không phải là mặt hàng lớn nhất về mặt giả thuyết). RecyclerView tự động thay đổi chiều cao của nó cũng được chấp nhận.
Tôi đã viết một ứng dụng mẫu để minh họa sự cố. Trong ứng dụng này, chúng tôi có một danh sách nằm ngang. 33 mục đầu tiên sẽ hiển thị 1 dòng văn bản, trong khi mục tiếp theo sẽ hiển thị 3 dòng văn bản và 34 dòng cuối cùng sẽ hiển thị 2 dòng. Tuy nhiên, tất cả chúng đều hiển thị 1 dòng, vì chiều cao của RecyclerView không thay đổi.
Tôi đã thử gọi requestLayout() trên RecyclerView (và trên TextView) từ onBindViewHolder(), nhưng dường như không làm gì cả.
MainActivity:
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>
Loại phiên bản recyclerView nào bạn có trên gradle? – Diekrul
bằng cách sử dụng mới nhất 25.1.1 – Gak2
@ Gak2 Tôi đã tự hỏi nếu bạn tìm thấy một giải pháp cho điều này bởi vì tôi đang đối mặt với cùng một vấn đề ngay bây giờ –