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"
, Как мне достичь fill_parent в Java? Вы можете увидеть, как я попробовал это в моем onBindViewHolder
, Я понял, почему это приводит к ошибке во время выполнения с "нулевой ссылкой на объект": мой getLayoutParams
не работает, потому что представление еще не было назначено группе просмотра (правильно?). Когда менеджер компоновки (это менеджер компоновки делает это, верно?) Назначает представление группе просмотра (которую я предполагаю, что это просмотрщик ресурсов) и как я могу получить свою кнопку после того, как это произошло, чтобы редактировать ее LayoutParams?
1 ответ
Хотя, вероятно, есть крючки для вас, чтобы взглянуть на вид элемента, который прикреплен к 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
,