Recyclerview:在不膨胀的情况下编辑视图的布局参数
Recyclerview: edit the layout parameters of the views without inflating
这是我的适配器中的代码:
public MyAdapter.MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType){
Button b = new Button(parent.getContext());
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AddExerciseActivity mActivity = (AddExerciseActivity) view.getContext();
mActivity.startExercise(view);
}
});
MyViewHolder vh = new MyViewHolder(b);
return vh;
}
public void onBindViewHolder(MyViewHolder vh, int position){
vh.mButton.setText(mDataset[position][0]);
vh.mButton.setTag(mDataset[position][1]);
ViewGroup.LayoutParams lp = vh.mButton.getLayoutParams();
lp.width = ViewGroup.LayoutParams.FILL_PARENT;
vh.mButton.setLayoutParams(lp);
}
如您所见,我没有在我的 onCreateViewHolder
中充气任何东西。我只是拿一个普通按钮,没有涉及自定义 xml。如果我选择了自定义 XML,那么很容易实现我想要的结果:android:layout_width="fill_parent"
。如何在 java 中实现 fill_parent?你可以在我的 onBindViewHolder
中看到我是如何尝试的。我已经理解为什么这会导致 "null object reference" 的运行时错误:我的 getLayoutParams
不起作用,因为尚未将视图分配给视图组(正确吗?)。布局管理器(是布局管理器执行此操作,对吗?)何时将视图分配给视图组(我假设是 recyclerview)以及如何在发生之后获取我的按钮以编辑其布局参数?
虽然可能有一些挂钩可以让您查看附加到 RecyclerView
的项目视图(RecyclerView#OnChildAttachStateChangeListener 也许,但我没有调查过),我认为最好只在 onCreateViewHolder()
中分配布局参数,如下所示:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Button b= new Button(parent.getContext());
ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
return new ItemViewHolder(b);
}
当视图项添加到 RecyclerView
时,将处理布局参数。
这是我的适配器中的代码:
public MyAdapter.MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType){
Button b = new Button(parent.getContext());
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AddExerciseActivity mActivity = (AddExerciseActivity) view.getContext();
mActivity.startExercise(view);
}
});
MyViewHolder vh = new MyViewHolder(b);
return vh;
}
public void onBindViewHolder(MyViewHolder vh, int position){
vh.mButton.setText(mDataset[position][0]);
vh.mButton.setTag(mDataset[position][1]);
ViewGroup.LayoutParams lp = vh.mButton.getLayoutParams();
lp.width = ViewGroup.LayoutParams.FILL_PARENT;
vh.mButton.setLayoutParams(lp);
}
如您所见,我没有在我的 onCreateViewHolder
中充气任何东西。我只是拿一个普通按钮,没有涉及自定义 xml。如果我选择了自定义 XML,那么很容易实现我想要的结果:android:layout_width="fill_parent"
。如何在 java 中实现 fill_parent?你可以在我的 onBindViewHolder
中看到我是如何尝试的。我已经理解为什么这会导致 "null object reference" 的运行时错误:我的 getLayoutParams
不起作用,因为尚未将视图分配给视图组(正确吗?)。布局管理器(是布局管理器执行此操作,对吗?)何时将视图分配给视图组(我假设是 recyclerview)以及如何在发生之后获取我的按钮以编辑其布局参数?
虽然可能有一些挂钩可以让您查看附加到 RecyclerView
的项目视图(RecyclerView#OnChildAttachStateChangeListener 也许,但我没有调查过),我认为最好只在 onCreateViewHolder()
中分配布局参数,如下所示:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Button b= new Button(parent.getContext());
ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
return new ItemViewHolder(b);
}
当视图项添加到 RecyclerView
时,将处理布局参数。