所以我需要一个水平的RecyclerView,但是,其中的项目根据从后端返回的内容具有动态高度。
RecyclerView及其项目的高度为“wrap_content”
问题是,如果RecyclerView中的第一个可见项目很小,那么当用户滚动到较大的项目时,它们看起来被截断了。
理想情况下,我们希望RecyclerView足够大,可以容纳组中最大的项(但只能容纳现有的最大项,而不是假设的最大项)。
我写了一个示例应用程序来说明这个问题。在这个应用程序中,我们有一个水平列表。前33个项目应该显示1行文本,下一个应该显示3行文本,最后34个应该显示2行文本。但是,它们都显示1行,因为RecyclerView的高度没有改变。
我尝试过从onBindViewHolder()调用RecyclerView(和TextView)上的requestLayout(),但它似乎没有任何作用。
主要活动:
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);
}
}
}
活动_主要.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>
项目.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>
7条答案
按热度按时间66bbxpm51#
更改您的回收站视图高度和宽度从
wrap_content
更改为match_parent
,或者您也可以为回收站给予固定高度视图为android:layout_height="150dp"
或者你可以试试
niwlg2el2#
使用下面的代码更改您的item.xml布局内容。它将解决您的问题。
fae0ux8s3#
您可以使用FlexboxLayoutManager Google库解决此问题,方法是将FlexDirection定义为FlexDirection.ROW,将FlexWrap定义为FlexWrap.NOWRAP,并在BaseViewHolder构造函数中将每个项目的FlexShrink设置为0.0f以便能够水平滚动。有关如何实现此目的的更多详细信息,请参见此处:带有动态项目高度的水平循环视图
roejwanj4#
主要活动:
活动_主要.xml:
item.xml
liwlm1x95#
要使RecyclerView水平,您需要使用
android:layout_centerHorizontal="true"
。此外,其他一切都与垂直相同。mm9b1k5b6#
尝试添加您的文本View
android:singleLine="false"
当有多行时它会更改yhxst69z7#
只需调用itemAdapter.notifyDataSetChanged();