Android 为什么我们需要RecyclerView上的ViewGroup参数?
我在RecyclerView工作,我有以下方法:Android 为什么我们需要RecyclerView上的ViewGroup参数?,android,android-adapter,android-recyclerview,Android,Android Adapter,Android Recyclerview,我在RecyclerView工作,我有以下方法: // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a ne
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
// set the view's size, margins, paddings and layout parameters
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
我需要清楚地解释这个参数parent
我们为什么要使用它,以及它的用途是什么???根据
视图组是一种特殊视图,可以包含其他视图(称为
视图组是布局和视图的基类
容器。此类还定义了ViewGroup.LayoutParams类
作为布局参数的基类
即ViewGroup
是一个不可见的容器,它既可以容纳View
s,也可以容纳ViewGroup
s。例如:LinearLayout是包含按钮(视图)和其他布局的视图组
而onCreateViewHolder()
中的ViewGroup
的目的是当RecyclerView
中的项目需要表示特定的ViewGroup
时。为此,您可以手动创建新视图,也可以从XML布局文件将其膨胀。正如在代码中一样,您正在从xml膨胀:
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
新的ViewHolder将用于稍后使用
onBindViewHolder()
显示适配器的项目 你真正应该问的问题是:
膨胀视图时,为什么需要传入父视图
当您创建了my_text\u view
布局时,它可能有一些类似以下内容的XML:
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
/>
但是,如果您这样做,那么您在XML中指定的任何布局
属性都将被丢弃。这可能会导致您的布局与预期的不同
为什么我们使用parent.getContext()而不是活动上下文
您可以使用活动上下文,大多数情况下,它不会产生任何影响。父级很可能从活动继承了其上下文
但是,也可能是父视图修改了上下文,例如为其指定了不同的主题。正如您在充气()中看到的,这意味着返回的视图与该父视图没有关联!!请再给我一张纸条!为什么我们使用parent.getContext()而不是将活动上下文作为ListView传递?我搜索了parent参数,发现RecyclerView总是将自身作为父视图传递,这解释了LayoutParams在这种上下文中的含义,膨胀的布局将采用RecyclerView的LayoutParams,这是真的吗?膨胀的布局将使用RecyclerView(父级)提供的值(宽度、高度等)来计算其布局参数。关于上下文的其他说明,您说视图上下文和活动上下文之间没有区别,我参考了android文档,视图不继承上下文类,所以有不同的权限<代码>视图
不继承上下文
。但是,视图
类将上下文
作为其成员变量之一。这是在其构造函数中设置的,通常是活动上下文
LayoutInflater
.from(parent.getContext())
.inflate(R.layout.my_text_view, null);