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 не работает, потому что представление еще не назначено группе просмотра (правильно?). Когда менеджер компоновки (именно менеджер компоновки делает это, верно?) назначает представление группе просмотра (которой, как я предполагаю, является recyclerview) и как я могу получить свою кнопку после того, как это произошло, чтобы отредактировать ее Параметры макета?


person Robert    schedule 16.01.2019    source источник


Ответы (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.

person Cheticamp    schedule 16.01.2019
comment
ах, спасибо, оба очень удовлетворительных решения. относительно второго: есть ли случай, когда менеджеру макета необходимо установить параметры макета для представления, и тогда менеджер просто переопределит то, что я сделал в onCreateViewHolder? или он сначала извлечет существующие параметры макета, а затем отредактирует их? Я думаю, что выберу первое решение, похоже, что onChildViewAttachedToWindow - это правильный хук, который я ищу (вызывается, когда представление прикреплено к RecyclerView). Спасибо! - person Robert; 17.01.2019