Как правильно использовать привязку Android View Binding в классе адаптеров RecyclerView? - PullRequest
4 голосов
/ 13 марта 2020

Вот код, который я использовал в своем классе RecycleView адаптера. Я не знаю, это правильный способ или не использовать View Binding. Если у вас есть лучшее решение, ответьте мне. Спасибо.

@Override
public CategoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.common_circle_image, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull CategoryAdapter.MyViewHolder holder, final int position) {
    holder.binding.img.setBackgroundResource(addAdapterData.get(position).getItemUrl());
    holder.binding.txt.setText(addAdapterData.get(position).getItemName());
}

@Override
public int getItemCount() {
    return addAdapterData.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    CommonCircleImageBinding binding;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        binding = CommonCircleImageBinding.bind(itemView);
        binding.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                commonItemClick.onItemClick(getAdapterPosition(),"");
            }
        });
    }
}

Также я хочу знать, правильно ли использовать R.layout.layout_name и ViewBinding в одном классе.

Ответы [ 3 ]

7 голосов
/ 13 марта 2020

Что вам нужно сделать, это передать созданный объект класса привязки в конструктор класса держателя. В вашем примере у вас есть common_circle_image XML файл для элемента RecyclerView, а сгенерированный класс - CommonCircleImageBinding, поэтому вы используете onCreateViewHolder для передачи сгенерированного класса привязки в ViewHolder класс

@NonNull
@Override
public CategoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    CommonCircleImageBinding itemBinding = CommonCircleImageBinding .inflate(LayoutInflater.from(parent.getContext()), parent, false);
    return new MyViewHolder(itemBinding);
}

и используйте класс держателя, как этот, чтобы вы могли использовать эти поля в onBindViewHolder

static class MyViewHolder extends RecyclerView.ViewHolder {
    private TextView txt;
    private ImageView img; 

    MyViewHolder(CommonCircleImageBinding itemBinding) {
        super(itemBinding.getRoot());
        img = itemBinding.img ;
        txt = itemBinding.txt ;
    }
}
0 голосов
/ 13 марта 2020

Вы можете напрямую использовать DataBindingUtil для получения привязки из макета в onCreateViewHolder следующим образом.

Затем измените ваш ViewHolder, чтобы принять binding в качестве аргумента.

@Override
public CategoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    CommonCircleImageBinding binding = DataBindingUtil
        .inflate(inflater, R.layout.common_circle_image, parent, false);

    return new MyViewHolder(binding);
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    public MyViewHolder(@NonNull CommonCircleImageBinding binding) {
        super(binding.getRoot());

        binding.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                commonItemClick.onItemClick(getAdapterPosition(),"");
            }
        });
    }
}
0 голосов
/ 13 марта 2020

Вы можете создать CommonCircleImageBinding непосредственно в onCreateViewHolder с помощью CommonCircleImageBinding.inflate(LayoutInflater.from(parent.getContext()))

Затем передать его в MyViewHolder

...