LayoutInflater 忽略 XML 属性
LayoutInflater ignores XML attributes
我的 LayoutInflater 有问题。
首先这是我的 item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/button" >
</RelativeLayout>
(我删除了这个问题所有不必要的东西)
当我像这样在 RecyclerViewAdapter 中设置 LayoutInflater 时:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);
一切正常,看起来我希望它是:
在许多关于 LayouInflater 的文档和文章中,他们建议像这样使用 LayoutInflater:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
但是当我这样做时,它会忽略 item.xml 文件中的属性:
有很多文章解释了第一种方法(对我有用的方法)应该避免。
这是其中一篇文章:
https://web.archive.org/web/20190528213406/https://possiblemobile.com/2013/05/layout-inflation-as-intended/
这是我的全部 RecyclerView.Adapter class:
public class AdapterTest extends RecyclerView.Adapter<AdapterTest.TestViewHolder> {
@Override
public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);
return new TestViewHolder(v);
}
@Override
public void onBindViewHolder(final TestViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 10;
}
public class TestViewHolder extends RecyclerView.ViewHolder {
public TestViewHolder(View itemView) {
super(itemView);
}
}
}
如何使用推荐的方式,仍然得到我想要的结果?
我通过在 onCreateViewHolder 中添加这两行来修复它:
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
v.setLayoutParams(lp);
我的 onCreateViewHolder 现在看起来像这样:
@NonNull
@Override
public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
v.setLayoutParams(lp);
return new TestViewHolder(v);
}
这是我从中得到的答案:
我无法真正解释为什么它现在可以工作,因为我的 RecyclerView 从一开始就设置为 MatchParent 宽度和高度。
我很高兴它现在能用了
我的 LayoutInflater 有问题。 首先这是我的 item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/button" >
</RelativeLayout>
(我删除了这个问题所有不必要的东西)
当我像这样在 RecyclerViewAdapter 中设置 LayoutInflater 时:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);
一切正常,看起来我希望它是:
在许多关于 LayouInflater 的文档和文章中,他们建议像这样使用 LayoutInflater:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
但是当我这样做时,它会忽略 item.xml 文件中的属性:
有很多文章解释了第一种方法(对我有用的方法)应该避免。 这是其中一篇文章: https://web.archive.org/web/20190528213406/https://possiblemobile.com/2013/05/layout-inflation-as-intended/
这是我的全部 RecyclerView.Adapter class:
public class AdapterTest extends RecyclerView.Adapter<AdapterTest.TestViewHolder> {
@Override
public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);
return new TestViewHolder(v);
}
@Override
public void onBindViewHolder(final TestViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 10;
}
public class TestViewHolder extends RecyclerView.ViewHolder {
public TestViewHolder(View itemView) {
super(itemView);
}
}
}
如何使用推荐的方式,仍然得到我想要的结果?
我通过在 onCreateViewHolder 中添加这两行来修复它:
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
v.setLayoutParams(lp);
我的 onCreateViewHolder 现在看起来像这样:
@NonNull
@Override
public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
v.setLayoutParams(lp);
return new TestViewHolder(v);
}
这是我从中得到的答案:
我无法真正解释为什么它现在可以工作,因为我的 RecyclerView 从一开始就设置为 MatchParent 宽度和高度。 我很高兴它现在能用了