RecyclerVIew 项目宽度不填满屏幕宽度
RecyclerVIew item width doesn't fill screen width
我正在用自定义视图填充 RecyclerView
作为列表项,ListItem
,从 onCreateViewHolder
函数创建它。
问题是,列表项视图的宽度没有填满 recyclerview(父视图)的宽度,但实际上它包裹了内容的宽度(设置为 match_parent 而不是 wrap_content).
我猜是因为我以编程方式创建视图,所以它不知道它的父视图。
这是我在适配器中创建 ListItem
的地方:
@NonNull
@Override
public ListItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ListItemHolder(new ListItem(parent.getContext()));
}
以及 ListItem
的代码
public class ListItem extends LinearLayout {
private ListItemBinding binding;
private final Context mContext;
public ListItem(Context context) {
super(context);
mContext = context;
setUp();
}
public ListItem(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setUp();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListItem, 0, 0);
setBigText(a.getString(R.styleable.ListItem_bigText));
setSmallText(a.getString(R.styleable.ListItem_smallText));
setImageDrawable(a.getDrawable(R.styleable.ListItem_src));
setHeaderText(a.getString(R.styleable.ListItem_header));
showHeader(binding.listItemHeaderText.getText() != null);
a.recycle();
}
public void setUp() {
binding = ListItemBinding.inflate(LayoutInflater.from(mContext), this, true);
setClickable(true);
setFocusable(true);
}
public void setBigText(@Nullable String text) {
binding.listItemBigText.setText(text == null ? "" : text);
}
.
.
.
.
.
}
我尝试将父级作为参数传递给 ListItem
构造函数并对其进行膨胀,但它引发了与上下文相关的错误。
我怎样才能给 ListItem
充气,同时保持它作为一个单独的 class 并使其填充它的父级宽度?
我可以创建列表项的布局并从 onCreateViewHolder
中的布局展开而不是从自定义视图展开 class 但我想
将其分开并可重复使用。
解决方案
感谢@Zain,他的解决方案只是通过视图 class 将宽度设置为 MATCH_PARENT,
显然它忽略了 xml.
我所做的改变:
public class ListItem extends LinearLayout {
.
.
.
public void setUp() {
binding = ListItemBinding.inflate(LayoutInflater.from(mContext), this, true);
setClickable(true);
setFocusable(true);
*setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));*
}
.
.
.
}
尝试在onCreateViewHolder()
实例化的同时设置它:
@NonNull
@Override
public ListItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ListItem listItem = new ListItem(parent.getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
listItem.setLayoutParams(params);
return new ListItemHolder(listItem);
}
我正在用自定义视图填充 RecyclerView
作为列表项,ListItem
,从 onCreateViewHolder
函数创建它。
问题是,列表项视图的宽度没有填满 recyclerview(父视图)的宽度,但实际上它包裹了内容的宽度(设置为 match_parent 而不是 wrap_content).
我猜是因为我以编程方式创建视图,所以它不知道它的父视图。
这是我在适配器中创建 ListItem
的地方:
@NonNull
@Override
public ListItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ListItemHolder(new ListItem(parent.getContext()));
}
以及 ListItem
public class ListItem extends LinearLayout {
private ListItemBinding binding;
private final Context mContext;
public ListItem(Context context) {
super(context);
mContext = context;
setUp();
}
public ListItem(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setUp();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ListItem, 0, 0);
setBigText(a.getString(R.styleable.ListItem_bigText));
setSmallText(a.getString(R.styleable.ListItem_smallText));
setImageDrawable(a.getDrawable(R.styleable.ListItem_src));
setHeaderText(a.getString(R.styleable.ListItem_header));
showHeader(binding.listItemHeaderText.getText() != null);
a.recycle();
}
public void setUp() {
binding = ListItemBinding.inflate(LayoutInflater.from(mContext), this, true);
setClickable(true);
setFocusable(true);
}
public void setBigText(@Nullable String text) {
binding.listItemBigText.setText(text == null ? "" : text);
}
.
.
.
.
.
}
我尝试将父级作为参数传递给 ListItem
构造函数并对其进行膨胀,但它引发了与上下文相关的错误。
我怎样才能给 ListItem
充气,同时保持它作为一个单独的 class 并使其填充它的父级宽度?
我可以创建列表项的布局并从 onCreateViewHolder
中的布局展开而不是从自定义视图展开 class 但我想
将其分开并可重复使用。
解决方案
感谢@Zain,他的解决方案只是通过视图 class 将宽度设置为 MATCH_PARENT, 显然它忽略了 xml.
我所做的改变:
public class ListItem extends LinearLayout {
.
.
.
public void setUp() {
binding = ListItemBinding.inflate(LayoutInflater.from(mContext), this, true);
setClickable(true);
setFocusable(true);
*setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));*
}
.
.
.
}
尝试在onCreateViewHolder()
实例化的同时设置它:
@NonNull
@Override
public ListItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ListItem listItem = new ListItem(parent.getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
listItem.setLayoutParams(params);
return new ListItemHolder(listItem);
}