RecyclerVIew 项目宽度未填充屏幕宽度

时间:2021-01-08 14:24:37

标签: java android android-recyclerview android-custom-view

我正在用自定义视图填充 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 保持为单独的类并使其填充其父宽度的同时对其进行膨胀?

我可以创建列表项的布局并从 onCreateViewHolder 中的布局膨胀,而不是从自定义视图类膨胀,但我想 将其分开并重复使用。

解决方案

感谢@Zain,他的解决方案只是通过视图类将宽度设置为 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));*
    }

    .
    .
    .
}

1 个答案:

答案 0 :(得分:0)

尝试在 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);
    
}