我打赌这是一个微不足道的错误。但是我坐在这里浪费了几个小时:
我有一个简单的应用程序,可以扫描蓝牙设备,并在RecyclerView中显示已发现设备的信息(每个设备一张卡)。单击其中一个CardView会启动与相应设备的连接。
在扫描停止后(几秒钟后),该工作正常,并且卡不再绑定到新数据。然而,在扫描过程中,只能识别卡片上的少量触摸。
我正在onCreateViewHolder()
中设置点击监听器,如下所示:
@Override
public DeviceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CardView cardView = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view, parent, false);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick() called with: v = [" + v + "]");
}
});
return new DeviceViewHolder(cardView);
}
我的第一个猜测是CPU已加载到完全,因为每个蓝牙设备发现都在主线程上处理(我认为)。但是分析器显示CPU仅加载到15%。
这是我在设备发现时执行的回调(每秒发生几十次):
bluetoothAdapter.startLeScan(callback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
// update List<BluetoothDevice> that is shown by the RecyclerView.Adapter
devicesAdapter.notifyDataSetChanged();
}
});
我不确定它是否与我的蓝牙回调被快速调用有关,或者是因为我的ViewHolders在扫描期间快速绑定到新数据。
答案 0 :(得分:0)
相反,您可以将setOnClickListener
放置在扩展RecyclerView.ViewHolder
的类中。
class MyViewHolder extends RecyclerView.ViewHolder {
TextView txtDate;
TextView txtDescription;
MyViewHolder (View itemView) {
super(itemView);
//...findViewById
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
//Do something here...
}
});
}
因此,您的onCreateViewHolder(...)
方法变为:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.my_layout, parent, false);
return new MyViewHolder(view);
}