Skip to main content
 首页 » 编程设计

java之找到重复的蓝牙设备。我在这里双重浸渍吗还能够更新 recyclerview

2024年07月26日32xing901022

我正在尝试构建一个扫描蓝牙设备并将它们添加到 recyclerview 的 android 应用程序。当我尝试清除我的 arraylist 并在适配器中向它添加新数据时,我最终得到一个空的 arraylist。当我不清除列表时,我最终得到一个包含每个设备两次的列表,如下所示:[**:71:9F:B6:59:**, **:71:9F:B6:59: **] 在 logcat 中。我还认为我的 notifydatasetchanged 调用在这里做错了,因为我的 recyclerview 中根本没有显示任何内容。我确定这是我所缺少的简单东西,但我只是看不到它。我正在发布我的主要 Activity 的代码以及我的 recyclerview.adapter,希望有人能向我指出问题。提前致谢。这是我的主要 Activity :

public class ToofActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { 
 
private static final String TAG = "ToofActivity"; 
private static final int REQUEST_COARSE_LOCATION = 222; 
 
private static BluetoothAdapter btAdapter; 
 
private TextView mStatusLabel; 
private Switch mStatusSwitch; 
private ProgressBar mProgressBar; 
private RecyclerView mDeviceRecylcer; 
private static ArrayList<BluetoothDevice> mDevices = new ArrayList<>(); 
private DeviceAdapter mAdapter; 
 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_toof); 
 
    checkLocationPermission(); 
 
    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
 
    mStatusLabel = (TextView) findViewById(R.id.status_view); 
    mStatusSwitch = (Switch) findViewById(R.id.status_switch); 
    mStatusSwitch.setChecked(btAdapter.isEnabled()); 
    mStatusSwitch.setOnCheckedChangeListener(this); 
    mProgressBar = (ProgressBar) findViewById(R.id.search_progress_bar); 
    mDeviceRecylcer = (RecyclerView) findViewById(R.id.device_recycler); 
 
    mDeviceRecylcer.setLayoutManager(new LinearLayoutManager(this)); 
    mAdapter = new DeviceAdapter(mDevices, getApplicationContext()); 
    mDeviceRecylcer.setAdapter(mAdapter); 
 
} 
 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 
 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
        case R.id.searchOption: 
            DiscoveryTask discovery = new DiscoveryTask(btAdapter, this, mDevices, mProgressBar); 
            discovery.setOnCompleteListener(new DiscoveryTask.OnCompletedListener() { 
                @Override 
                public void onComplete() { 
                    Log.d(TAG, "devices found : " + mDevices.toString()); 
                    mAdapter.updateItems(mDevices); 
                } 
            }); 
            discovery.execute((Void) null); 
            break; 
    } 
 
    return true; 
} 
 
@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    if (isChecked) { 
        btAdapter.enable(); 
        mStatusLabel.setText("Active"); 
    } else { 
        btAdapter.disable(); 
        mStatusLabel.setText("Inactive"); 
    } 
} 
 
public static void setDeviceList(ArrayList<BluetoothDevice> deviceList) { 
    mDevices = deviceList; 
} 
 
protected void checkLocationPermission() { 
    if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) 
            != PackageManager.PERMISSION_GRANTED) { 
 
        ActivityCompat.requestPermissions(this, 
                new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
                REQUEST_COARSE_LOCATION); 
    } 
} 
 
@Override 
public void onRequestPermissionsResult(int requestCode, 
                                       String permissions[], int[] grantResults) { 
    switch (requestCode) { 
        case REQUEST_COARSE_LOCATION: { 
            if (grantResults.length <= 0 
                    || grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
                checkLocationPermission(); 
                break; 
            } 
        } 
    } 
} 
} 

还有我的适配器类,它是用 kotlin 而不是 java 编写的:

class DeviceAdapter(val mDevices: ArrayList<BluetoothDevice>, val mContext : Context) : RecyclerView.Adapter<DeviceAdapter.DeviceHolder>(){ 
 
fun updateItems(list: ArrayList<BluetoothDevice>){ 
    //mDevices.clear() 
    mDevices.addAll(list) 
    Log.d(TAG, "updating items : $mDevices") 
    notifyDataSetChanged() 
} 
 
override fun onBindViewHolder(holder: DeviceHolder, position: Int) { 
    holder.bindItems(mDevices.get(position)) 
} 
 
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): DeviceHolder?{ //return is not to be NULL! 
    val v = LayoutInflater.from(mContext).inflate(R.layout.device_item, parent, false) 
    return DeviceHolder(v) 
} 
 
override fun getItemCount(): Int { 
    return mDevices.size 
} 
 
inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ 
    val nameView = itemView.findViewById(R.id.nameView) as TextView 
    val addrView = itemView.findViewById(R.id.addressView) as TextView 
 
    fun bindItems(btDevice: BluetoothDevice){ 
        nameView.text = btDevice.name 
        addrView.text = btDevice.address 
    } 
} 
 
companion object { 
    val TAG = "DeviceAdapter" 
} 
 
} 

请您参考如下方法:

问题在于 DeviceAdapter.mDevicesToofActivity.mDevices 是同一个对象。因此,当您清除它时,两者都变为空,当您 mDevices.addAll(mDevices) 时,元素会加倍。

DeviceAdapter 的构造函数参数中移除 mDevices。 在 DeviceAdapter 中为其创建一个新的 ArrayList