Один и тот же объект адаптера показан несколько раз, но почему?

Я сделал собственный Listview и Listviewadapter. Каким-то образом одни и те же данные отображаются несколько раз в моем списке, но я не знаю, почему.

Я попытался отладить его, но, похоже, он не был добавлен дважды.

Как видите, я управляю вводом адаптера с помощью .contains, но это не помогает.

Радиовещательный приемник

   private BroadcastReceiver BR_BT_Device= new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
           String action_BR_BT_Device= intent.getAction();

            if (action_BR_BT_Device.equals(BluetoothDevice.ACTION_FOUND))
            {
                BluetoothDevice device = 
      intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (!device.equals(null)) {
                    String sDevice_Address = device.getAddress();
                    if (!(sDevice_Address == null)) {
                        if (device.getName() == null){
                            mDeviceName = "Kein Name";
                        }
                        else {
                            mDeviceName = device.getName();
                        }
                        cBT_DeviceList mDevice = new 
       cBT_DeviceList(mDeviceName, sDevice_Address);

                        if (!(cBT_popup.mBTDevice.contains(mDevice))) {
                            cBT_popup.mBTDevice.add(mDevice);

       cBT_popup.cBTDeviceListAdapter.notifyDataSetChanged();
                        }
                    }
                }
                Log.d("Resiver", "onReceive: "+device.getAddress());
            }
        }
    };

Активность для Listview obj

    public class cBT_popup extends MainActivity {
        public static ArrayList<cBT_DeviceList> mBTDevice = new
                ArrayList<cBT_DeviceList>();
        public ListView lv_devices;
        public static cBT_DeviceList_Adapter cBTDeviceListAdapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.bt_popup);
            lv_devices = findViewById(R.id.lv_devices);
            cBTDeviceListAdapter = new cBT_DeviceList_Adapter(this,
                    R.layout.lrv_bt_listview, mBTDevice);
            lv_devices.setAdapter(cBTDeviceListAdapter);
            lv_devices.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

Если вам нужна дополнительная информация, дайте мне знать.

Если это важно: выделить выделенный элемент не представляется возможным, пока не знаю почему.

IntentFilter для трансляции

´´´ IntentFilter BT_Device_filter = новый
IntentFilter(BluetoothDevice.ACTION_FOUND);

´´´

Добавьте свой полный код. Когда будет вызван ваш BroadcastReceiver?

Rajat Mehra 29.05.2019 13:58

Я пытался загрузить полный код, но Stack overvlow не хочет этого делать.

Alpha-Centauri 29.05.2019 14:03

В этом случае я могу предположить, что ваш onReceive вызывается несколько раз для одного и того же BluetoothDevice.

Rajat Mehra 29.05.2019 14:06

Это возможно, но ".contains" должен остановить это или нет?

Alpha-Centauri 29.05.2019 14:09

Никакой cBT_popup.mBTDevice.contains(mDevice) не будет ограничивать уже добавленное устройство, так как mDevice — это вновь созданный объект, он не будет соответствовать элементам вашего списка. Код дам в ответ, попробуйте один раз.

Rajat Mehra 29.05.2019 14:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть onRecieve вызывается несколько раз для одного и того же BluetoothDevice.

Попробуйте это... Заменить

if (!(cBT_popup.mBTDevice.contains(mDevice))) {
        cBT_popup.mBTDevice.add(mDevice);

        cBT_popup.cBTDeviceListAdapter.notifyDataSetChanged();
    }

с участием

boolean alreadyExist = false;
    for(cBT_DeviceList mBTDeviceObj : mBTDevice){
        if (mDevice.getName().equals(mBTDeviceObj.getName())){
            alreadyExist = true;
        }
    }
    if (!alreadyExist) {
        cBT_popup.mBTDevice.add(mDevice);
        cBT_popup.cBTDeviceListAdapter.notifyDataSetChanged();
    }

Он сравнит полученное имя устройства со всеми добавленными именами устройств.

Rajat Mehra 29.05.2019 14:32

Спасибо за помощь.

Alpha-Centauri 29.05.2019 14:39

Другие вопросы по теме