如何检查 recyclerview 适配器上的空侦听器?

How to check for null listener on recyclerview adapter?

我遇到的问题是,当我单击我的适配器项时,传递给适配器 class 的侦听器为空,因此它永远不会触发任何内容。它确实通过调试告诉我正在点击某些东西。 我的 parent class 是新的 kotlin class,适配器是旧的 java class。我已经将 java class 传递给 kotlin,但结果是一样的。

这是我的适配器class

public class CustomersAdapter extends RecyclerView.Adapter<CustomersAdapter.CustomerViewHolder> implements View.OnClickListener {

private List<Customer> customers;
private View.OnClickListener listener;
private CustomersAdapter.OnItemClickListener mListener;

public CustomersAdapter(List<Customer> customer){
    customers = customer;
}

@NonNull
@Override
public CustomerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_customers, viewGroup, false);
    v.setOnClickListener(this);
    return new CustomerViewHolder(v,mListener);
}

@Override
public void onBindViewHolder(@NonNull CustomerViewHolder customerViewHolder, int i) {
    customerViewHolder.txtCustomerName.setText(customers.get(i).custName1+" "+customers.get(i).custName2+" "+customers.get(i).custLastName1+" "+customers.get(i).custLastName2);
    customerViewHolder.txtCustomerNickname.setText(customers.get(i).custNickName);
}

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

public void setOnClickListener(View.OnClickListener listener){
    this.listener = listener;
}

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

public void setOnItemClickListener(CustomersAdapter.OnItemClickListener listener) {
    mListener = listener;
}

@Override
public void onClick(View v) {
    if(listener != null){
        listener.onClick(v);
    }
}

static class CustomerViewHolder extends RecyclerView.ViewHolder {
    TextView txtCustomerName;
    TextView txtCustomerNickname;
    LinearLayout lytCustomerInfo;

    CustomerViewHolder(View itemView, final CustomersAdapter.OnItemClickListener listener) {
            super(itemView);
        lytCustomerInfo  = itemView.findViewById(R.id.lytCustomerInfo);
        txtCustomerName = itemView.findViewById(R.id.txtNameCustomerAdapter);
        txtCustomerNickname = itemView.findViewById(R.id.txtNicknameCustomerAdapter);
        lytCustomerInfo.setOnClickListener(v -> {
            if (listener != null) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    listener.onItemSelected(position);
                }
            }
        });
    }

}

}

我同时制作了 onclicklistener 和 itemclicklistener,其中 none 正在做任何事情。

val customer = Customer()
        customersList = if (filter.trim { it <= ' ' } == "") ArrayList() else customer.getCustomers(filter)

    customersAdapter = CustomersKtAdapter(context, customersList)

    rcvCustomer.adapter = customersAdapter

    customersAdapter.setOnClickListener { v ->
        Log.d("TAG", "message")
    }

    customersAdapter!!.setOnItemClickListener( object: CustomersAdapter.OnItemClickListener {
        override fun onItemSelected(position: Int) {
            Log.d("TAG", "message")
        }
    })

任何帮助或建议都将非常有用,谢谢!

我制作了一个适配器 kotlin class 试图只实现 OnClick 而不是 OnItemClick,但结果是一样的,一旦我点击它,监听器就为 null

class CustomersKtAdapter(applicationContext: Context, customerList: MutableList<Customer>) : RecyclerView.Adapter<CustomersKtAdapter.CustomersKtViewHolder?>(), View.OnClickListener{

private var listener: View.OnClickListener? = null

var context: Context? = null
private var defaultFormat: NumberFormat? = null
var inflater: LayoutInflater? = null

var customerList: List<Customer>? = null

init {
    this.context = applicationContext
    this.customerList = customerList
    defaultFormat = NumberFormat.getCurrencyInstance()
    inflater = LayoutInflater.from(context)
}

override fun onCreateViewHolder(parent: ViewGroup, p1: Int): CustomersKtViewHolder {
    //inflate view
    val v: View = LayoutInflater.from(parent.context).inflate(R.layout.adapter_customers, parent, false)
    v.setOnClickListener(this)
    return CustomersKtViewHolder(v)

}

override fun getItemCount(): Int {
    return customerList!!.size
}

override fun onBindViewHolder(holder: CustomersKtViewHolder, position: Int) {
    holder.txtNicknameCustomerAdapter!!.text = customerList?.get(position)?.custNickName
    holder.txtNameCustomerAdapter!!.text = customerList?.get(position)?.custName1

}

override fun onClick(view: View?) {
    listener?.onClick(view)
}

fun setOnClickListener(listener: View.OnClickListener?) {
    this.listener = listener
}

    class CustomersKtViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    
    var txtNicknameCustomerAdapter: TextView? = null
    var txtNameCustomerAdapter: TextView? = null

    init {
        txtNicknameCustomerAdapter  = itemView.findViewById(R.id.txtNicknameCustomerAdapter )
        txtNameCustomerAdapter  = itemView.findViewById(R.id.txtNameCustomerAdapter )
    }
}

}

parentclass

    customersAdapter!!.setOnClickListener(View.OnClickListener { v ->
        Log.d("TAG", "message")
    })

你也需要调用mListener

if (position != RecyclerView.NO_POSITION) {
    listener.onItemSelected(position);
    mListener.onItemSelected(position);
}

在设置适配器之前,尝试将 onclicklistener 放在父 class 上

    customersAdapter = CustomersAdapter(customersList)

    customersAdapter!!.setOnClickListener(View.OnClickListener { v ->
        Log.d("TAG", "message")
    })

    rcvCustomer.adapter = customersAdapter