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