Я новичок в Android Studio и пишу приложение, включающее функции Bluetooth. при заполнении моего списка с помощью обнаружения Bluetooth, мой getview для listadpater зацикливается 3 раза для каждого элемента в обнаруженном списке.
я потратил последние 4 часа, гоняясь за этим циклом, включая документацию по android, различные сообщения stackoverflow безответ (только один подошел близко, и единственный совет был «не беспокойтесь об этом»: android: мой цикл дубликатов ListAdapter Я поместил несколько строк sout в код, чтобы консоль показывала точно, где происходит цикл. У меня естьрефакторинг кода неоднократно, следуя различным советам онлайн, но я не могу найти ПОЧЕМУ цикл происходит, не говоря уже о том, как его остановить.
извинения, если код или вопрос плохо отформатирован: мой первый пост
широковещательныйфункция кнопки вызова получателя и широковещательный приемник
//discover devices
public void btnScanBtDev() {
Log.d(TAG, "btnScabBtDev: looking for devices... ");
//empty list if already populated (for more than one scan)
mBTDevices = new ArrayList<>();
//check if already in discovery mode
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
Log.d(TAG, "btnDiscover: Canceling discovery.");
}
mBluetoothAdapter.startDiscovery();
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mBroadcastReceiver3, discoverDevicesIntent);
}
private BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG, "broadcastReceiver3 (pairing): ACTION FOUND.");
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
System.out.println("new device object created");
mBTDevices.add(device);
Log.d(TAG, "broadcastReceiver3: BT_device name & address: "
+ device.getName() + ": " + device.getAddress());
mDeviceListAdapter = new DevLisAdap(context,R.layout.adapter_device_view, mBTDevices);
System.out.println("setting adapter");
//the loop occurs after this message so it must be executed by the following line?:
lvNewDevices.setAdapter(mDeviceListAdapter);
}
}
}
список адаптеров класса:
package com.example.bluetoothreceiver_v02;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class DevLisAdap extends ArrayAdapter<BluetoothDevice> {
private static final String TAG = "DevListAdap";
private LayoutInflater mLayoutInflater;
private ArrayList<BluetoothDevice> mDevices;
private int mViewResourceId;
public DevLisAdap(Context context, int tvResourceId, ArrayList<BluetoothDevice> devices) {
super(context, tvResourceId, devices);
System.out.println("getview constructor");
this.mDevices = devices;
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mViewResourceId = tvResourceId;
}
//method seems to loop 3x for each discovered item?
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("begin getview");
//counter to prove if entire method is called each time
int counter =0;
System.out.println("counter: "+counter);
View conView = convertView;
if(conView==null){
conView = mLayoutInflater.inflate(mViewResourceId, null);
System.out.println("inflated");
}
BluetoothDevice device = mDevices.get(position);
if (device != null) {
Log.d(TAG, "getView: BT_device exists.");
TextView deviceName = (TextView) conView.findViewById(R.id.tvDeviceName);
TextView deviceAdress = (TextView) conView.findViewById(R.id.tvDeviceAddress);
if (deviceName != null) {
System.out.println("name set");
deviceName.setText(device.getName());
} else {
Log.d(TAG, "getView: BT_device name is NULL!!");
}
if (deviceAdress != null) {
System.out.println("add set");
deviceAdress.setText(device.getAddress());
} else {
Log.d(TAG, "getView: BT_device address is NULL!!");
}
} else {
Log.d(TAG, "BT_device is NULL!!");
}
System.out.println("end of getview");
counter++;
return conView;
}
}
выход (для первого элемента, имя и адрес удалены):
D/BluetoothActions: btnScanBtDev: looking for devices...
D/BluetoothActions: broadcastReceiver3 (pairing): ACTION FOUND.
I/System.out: new device object created
D/BluetoothActions: broadcastReceiver3: BT_device name & address: xx
I/System.out: getview constructor
I/System.out: setting adapter
I/System.out: begin getview
counter: 0
I/System.out: inflated
I/System.out: name set
I/System.out: add set
I/System.out: end of getview
I/System.out: begin getview
counter: 0
name set
I/System.out: add set
end of getview
I/System.out: begin getview
I/System.out: counter: 0
name set
I/System.out: add set
I/System.out: end of getview
D/BluetoothActions: broadcastReceiver3 (pairing): ACTION FOUND.
...etcetc
кажется, что весь метод getView неоднократно (3 *) вызывается setAdapterдля каждого предмета обнаружена какая-то причина? (например, 1 элемент = 3 цикла, 4 элемента = 3 + 6 + 9 + 12 циклов = 30 и т. д.), хотя это не проблема для небольшого списка, это быстро приводит к большому количеству итераций! не говоря уже о том, что сводит с ума то, что он не может видеть, откуда он взялся? это стандартное поведение андроида, которое я не могу найти объяснение?