RecyclerView项目onClick在快速更新时无法正常工作

时间:2018-03-04 22:19:39

标签: android android-recyclerview

我打赌这是一个微不足道的错误。但是我坐在这里浪费了几个小时:

我有一个简单的应用程序,可以扫描蓝牙设备,并在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在扫描期间快速绑定到新数据。

1 个答案:

答案 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);
    }