Android:扩展BaseAdapter,但不更新列表

Android:扩展BaseAdapter,但不更新列表,android,android-listview,Android,Android Listview,我有两个列表在相同的活动布局中使用相同的扩展BaseAdapter,但当我调用notifyDataSetChanged时,只有一个列表会更新(当然,我两个都调用它)。我已经找了好几天了,找不到问题 该活动获取配对的和可用的蓝牙设备,并分别列出它们,我使用了BluetoothChat示例,但我需要自定义行,必须对其进行一些更改 主要问题是用“这只在另一个(就在下面)被注释时有效”,Ctrl+F可以更快地到达那里 这是我的专用BaseAdapter(可能没用,但我还是发布了它): /** *设备列表

我有两个列表在相同的活动布局中使用相同的扩展
BaseAdapter
,但当我调用
notifyDataSetChanged
时,只有一个列表会更新(当然,我两个都调用它)。我已经找了好几天了,找不到问题

该活动获取配对的和可用的蓝牙设备,并分别列出它们,我使用了
BluetoothChat
示例,但我需要自定义行,必须对其进行一些更改

主要问题是用“这只在另一个(就在下面)被注释时有效”,Ctrl+F可以更快地到达那里

这是我的专用
BaseAdapter
(可能没用,但我还是发布了它):

/**
*设备列表基本适配器,用于在自定义列表视图中显示设备。
*/
公共类DeviceListBaseAdapter扩展BaseAdapter
{
私有静态ArrayList设备ArrayList;
私人停车场;
公共设备ListBaseAdapter(上下文、ArrayList结果)
{
deviceArrayList=结果;
mInflater=LayoutInflater.from(上下文);
}
public int getCount()
{
返回deviceArrayList.size();
}
公共对象getItem(int位置)
{
返回设备arraylist.get(位置);
}
公共长getItemId(int位置)
{
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图)
{
视窗座;
if(convertView==null)
{
convertView=mInflater.充气(R.layout.device\u row\u view,空);
holder=新的ViewHolder();
holder.tvName=(TextView)convertView.findViewById(R.id.tvName);
holder.tvAddress=(TextView)convertView.findViewById(R.id.tvAddress);
holder.tvSignal=(TextView)convertView.findViewById(R.id.tvSignal);
convertView.setTag(支架);
}
其他的
{
holder=(ViewHolder)convertView.getTag();
}
holder.tvName.setText(deviceArrayList.get(position.getName());
holder.tvAddress.setText(deviceArrayList.get(position.getAddress());
如果(!deviceArrayList.get(position).getSignal()等于(“0”))
{
holder.tvSignal.setText(deviceArrayList.get(position.getSignal()+“dBm”);
}
返回视图;
}
静态类视窗夹
{
文本视图tvName;
文本视图地址;
文本视图电视信号;
}
}
以及使用它的活动:

public class DeviceSelectActivity extends Activity
{
    private ArrayList<Device> devAvailableList, devPairedList;
    private DeviceListBaseAdapter devAvailableListAdapter, devPairedListAdapter;
    private ListView devAvailableListView, devPairedListView;

    private Button bFindDevices;
    private BluetoothAdapter bluetoothAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.device_select);

        // Setup Bluetooth devices lists with custom rows
        devPairedListView = (ListView) findViewById(R.id.lvPairedDevices);
        devPairedList = new ArrayList<Device>();
        devPairedListAdapter = new DeviceListBaseAdapter(this, devPairedList);
        devPairedListView.setAdapter(devPairedListAdapter);

        // I commented this to see the behavior with only the first list    
//      devAvailableListView = (ListView) findViewById(R.id.lvAvailableDevices);
//      devAvailableList = new ArrayList<Device>();
//      devAvailableListAdapter = new DeviceListBaseAdapter(this, devAvailableList);
//      devAvailableListView.setAdapter(devAvailableListAdapter);

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        // Register a receiver to handle Bluetooth actions
        registerReceiver(Receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
        registerReceiver(Receiver, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));

        startDiscovery();
    }

    public void startDiscovery()
    {
        // Show search progress
        bFindDevices.setText(R.string.searching);
        bFindDevices.setEnabled(false);

        // Remove title for available devices
        findViewById(R.id.tvAvailableDevices).setVisibility(View.GONE);

        // Get a set of currently paired devices
        devPairedList.clear();
        devPairedListAdapter.notifyDataSetChanged();

        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
        if(pairedDevices.size() > 0)
        {
            findViewById(R.id.tvPairedDevices).setVisibility(View.VISIBLE);
            for(BluetoothDevice device : pairedDevices)
            {
                devPairedList.add(new Device(device.getName(), device.getAddress(), (short) 0));
                // This only works when the other (just below) is commented
                devPairedListAdapter.notifyDataSetChanged();
            }
        }

//      devAvailableList.clear();
//      devAvailableListAdapter.notifyDataSetChanged();

        bluetoothAdapter.startDiscovery();
    }

    // add found device to the devices list
    private final BroadcastReceiver Receiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action))
            {
                // Found a device in range
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Device foundDevice = new Device(device.getName(), device.getAddress(), intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE));
                // If it's not a paired device add it to the list
                if(device.getBondState() != BluetoothDevice.BOND_BONDED)
                {
//                  devAvailableList.add(foundDevice);
                    // Signal list content change
//                  devAvailableListAdapter.notifyDataSetChanged();
                    // Make the available devices title visible
                    findViewById(R.id.tvAvailableDevices).setVisibility(View.VISIBLE);
                }
            }
            else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
            {
                // When finished (timeout) remove the progress indicator
                bFindDevices.setText(R.string.search);
                bFindDevices.setEnabled(true);
            }
        }
    };
}
公共类设备选择活动扩展活动
{
私有ArrayList devAvailableList,devPairedList;
专用设备ListBaseAdapter devAvailableListAdapter、devPairedListAdapter;
私有ListView devAvailableListView、devPairedListView;
专用按钮设备;
私人蓝牙适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.device_select);
//设置带有自定义行的蓝牙设备列表
devPairedListView=(ListView)findViewById(R.id.lvPairedDevices);
devPairedList=新的ArrayList();
devPairedListAdapter=新设备ListBaseAdapter(此为devPairedList);
setAdapter(devPairedListAdapter);
//我对此进行了注释,以查看只有第一个列表的行为
//devAvailableListView=(ListView)findViewById(R.id.lvAvailableDevices);
//devAvailableList=新的ArrayList();
//devAvailableListAdapter=新设备ListBaseAdapter(此为devAvailableList);
//setAdapter(devAvailableListAdapter);
bluetoothAdapter=bluetoothAdapter.getDefaultAdapter();
//注册接收器以处理蓝牙操作
registerReceiver(接收器,新的IntentFilter(BluetoothDevice.ACTION_FOUND));
registerReceiver(接收器,新的IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
startDiscovery();
}
公开作废开始调查()
{
//显示搜索进度
bFindDevices.setText(R.string.search);
bFindDevices.setEnabled(错误);
//删除可用设备的标题
findViewById(R.id.tAvailableDevices).setVisibility(View.GONE);
//获取一组当前配对的设备
devPairedList.clear();
devPairedListAdapter.notifyDataSetChanged();
Set pairedDevices=bluetoothAdapter.getBondedDevices();
如果(pairedDevices.size()>0)
{
findViewById(R.id.tvPairedDevices).setVisibility(View.VISIBLE);
用于(蓝牙设备:pairedDevices)
{
添加(新设备(Device.getName(),Device.getAddress(),(short)0));
//这仅在对另一个(就在下面)进行注释时有效
devPairedListAdapter.notifyDataSetChanged();
}
}
//devAvailableList.clear();
//devAvailableListAdapter.notifyDataSetChanged();
bluetoothAdapter.startDiscovery();
}
//将找到的设备添加到设备列表
专用最终BroadcastReceiver=新的BroadcastReceiver()
{
@凌驾
公共void onReceive(上下文、意图)
{
String action=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(ACTION))
{
//在范围内找到一个设备
BluetoothDevice=intent.getParcelableExtra(BluetoothDevice.EXTRA\u设备);
Device foundDevice=新设备(Device.getName(),Device.getAddress(),intent.getShortExtra(BluetoothDevice.EXTRA\RSSI,Short.MIN\u VALUE));
//如果不是配对设备,则将其添加到列表中
if(device.getBondState()!=BluetoothDevice.BOND\u BOND)
{
//devAvailableList.add(foundDevice);
//信号列表公司
public class DeviceSelectActivity extends Activity
{
    private ArrayList<Device> devAvailableList, devPairedList;
    private DeviceListBaseAdapter devAvailableListAdapter, devPairedListAdapter;
    private ListView devAvailableListView, devPairedListView;

    private Button bFindDevices;
    private BluetoothAdapter bluetoothAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.device_select);

        // Setup Bluetooth devices lists with custom rows
        devPairedListView = (ListView) findViewById(R.id.lvPairedDevices);
        devPairedList = new ArrayList<Device>();
        devPairedListAdapter = new DeviceListBaseAdapter(this, devPairedList);
        devPairedListView.setAdapter(devPairedListAdapter);

        // I commented this to see the behavior with only the first list    
//      devAvailableListView = (ListView) findViewById(R.id.lvAvailableDevices);
//      devAvailableList = new ArrayList<Device>();
//      devAvailableListAdapter = new DeviceListBaseAdapter(this, devAvailableList);
//      devAvailableListView.setAdapter(devAvailableListAdapter);

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        // Register a receiver to handle Bluetooth actions
        registerReceiver(Receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
        registerReceiver(Receiver, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));

        startDiscovery();
    }

    public void startDiscovery()
    {
        // Show search progress
        bFindDevices.setText(R.string.searching);
        bFindDevices.setEnabled(false);

        // Remove title for available devices
        findViewById(R.id.tvAvailableDevices).setVisibility(View.GONE);

        // Get a set of currently paired devices
        devPairedList.clear();
        devPairedListAdapter.notifyDataSetChanged();

        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
        if(pairedDevices.size() > 0)
        {
            findViewById(R.id.tvPairedDevices).setVisibility(View.VISIBLE);
            for(BluetoothDevice device : pairedDevices)
            {
                devPairedList.add(new Device(device.getName(), device.getAddress(), (short) 0));
                // This only works when the other (just below) is commented
                devPairedListAdapter.notifyDataSetChanged();
            }
        }

//      devAvailableList.clear();
//      devAvailableListAdapter.notifyDataSetChanged();

        bluetoothAdapter.startDiscovery();
    }

    // add found device to the devices list
    private final BroadcastReceiver Receiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action))
            {
                // Found a device in range
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Device foundDevice = new Device(device.getName(), device.getAddress(), intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE));
                // If it's not a paired device add it to the list
                if(device.getBondState() != BluetoothDevice.BOND_BONDED)
                {
//                  devAvailableList.add(foundDevice);
                    // Signal list content change
//                  devAvailableListAdapter.notifyDataSetChanged();
                    // Make the available devices title visible
                    findViewById(R.id.tvAvailableDevices).setVisibility(View.VISIBLE);
                }
            }
            else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
            {
                // When finished (timeout) remove the progress indicator
                bFindDevices.setText(R.string.search);
                bFindDevices.setEnabled(true);
            }
        }
    };
}