2

我想在我的 ?中使用新的View Binding而不是ButterKnifeRecyclerView Adapter class

这是我的class

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.gallosalocin.mareu.R;
import com.gallosalocin.mareu.model.Meeting;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MeetingRecyclerViewAdapter extends RecyclerView.Adapter<MeetingRecyclerViewAdapter.ViewHolder> {

private List<Meeting> meetingsList;
private OnItemClickListener onItemClickListener;

MeetingRecyclerViewAdapter(List<Meeting> meetings, OnItemClickListener onItemClickListener) {
    this.meetingsList = meetings;
    this.onItemClickListener = onItemClickListener;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_main, parent, false);
    return new ViewHolder(view, onItemClickListener);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Meeting meeting = meetingsList.get(position);
    String descriptionItems = String.format("%1$s - %2$s - %3$s", meeting.getTopic(), meeting.getTime(), meeting.getRoom());

    holder.roomColor.setImageResource(meeting.getRoomColor());
    holder.description.setText(descriptionItems);
    holder.email.setText(meeting.getEmail());

}

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


public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    @BindView(R.id.iv_cardview_image)
    ImageView roomColor;
    @BindView(R.id.tv_cardview_description)
    TextView description;
    @BindView(R.id.tv_cardview_email)
    TextView email;
    @BindView(R.id.iv_cardview_delete_btn)
    ImageView deleteImage;
    @BindView(R.id.cardview_meeting)
    CardView cardView;

    OnItemClickListener onItemClickListener;

    ViewHolder(@NonNull View itemView, OnItemClickListener onItemClickListener) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        this.onItemClickListener = onItemClickListener;

        deleteImage.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.iv_cardview_delete_btn) {
            onItemClickListener.onDeleteClick(getAdapterPosition());
        }
    }
}

    public interface OnItemClickListener {
        void onDeleteClick(int position);
    }
}

我试试这个,但我有这个问题。

问题

实际上,我想删除所有代码行@BindView以使代码更具可读性。如果我犯了错误,对不起我的英语。

4

3 回答 3

2

对于那些想要完整解决方案的人:

class YourAdapter() : ListAdapter<YourCategory, YourAdapter.YourViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): YourViewHolder {
    val binding = YourItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return YourViewHolder(binding)
}

override fun onBindViewHolder(holder: YourViewHolder, position: Int) {
    // your stuff
}

class YourViewHolder(private val binding: YourItemBinding) : RecyclerView.ViewHolder(binding.root) {

        binding.apply {

            // your stuff
        }
    }
}
于 2021-02-22T09:54:02.947 回答
1

ViewHolder期望View实例通过。因此,只需传递binding.getRoot()而不是传递binding给构造函数,它就会起作用。

像这样:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // get your binding here: itemBinding = ...
    // and then:
    return new ViewHolder(itemBinding.getRoot(), onItemClickListener);
}
于 2020-03-23T10:35:30.913 回答
0

这可能会帮助你-

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    OnItemClickListener onItemClickListener;
    private CardviewMain binding; //binding class object

    ViewHolder(@NonNull CardviewMain binding, OnItemClickListener onItemClickListener) {
        super(binding.getRoot());
        this.binding = binding;
        this.onItemClickListener = onItemClickListener;

        this.binding.ivCardviewDeleteBtn.setOnClickListener(this);
    } 
}

在 onCreateViewHolder 中:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    CardviewMain binding = CardviewMain.inflate(layoutInflater, parent, false);
    return new ViewHolder(binding, onItemClickListener);
}
于 2021-02-11T06:43:53.567 回答