同じアクティビティ レイアウトで同じ拡張を使用する 2 つのリストがありますが、BaseAdapter
呼び出したときに更新されるのは 1 つだけですnotifyDataSetChanged
(もちろん、両方に対して呼び出します)。私は何日も探していましたが、問題を見つけることができません。
このアクティビティは、ペアリングされた使用可能な Bluetooth デバイスを取得し、それらを個別に一覧表示します。BluetoothChat
サンプルを使用しましたが、カスタム行が必要で、一部変更する必要がありました。
主な問題は、「これは、他の(すぐ下の)コメントがある場合にのみ機能します」とコメントされています.Ctrl + Fを使用すると、そこにすばやくアクセスできます。
これが私のスペシャルBaseAdapter
です(役に立たないかもしれませんが、とにかく投稿します):
/**
* Device list base adapter to show the devices in a custom ListView.
*/
public class DeviceListBaseAdapter extends BaseAdapter
{
private static ArrayList<Device> deviceArrayList;
private LayoutInflater mInflater;
public DeviceListBaseAdapter(Context context, ArrayList<Device> results)
{
deviceArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount()
{
return deviceArrayList.size();
}
public Object getItem(int position)
{
return deviceArrayList.get(position);
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.device_row_view, null);
holder = new 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);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.tvName.setText(deviceArrayList.get(position).getName());
holder.tvAddress.setText(deviceArrayList.get(position).getAddress());
if(!deviceArrayList.get(position).getSignal().equals("0"))
{
holder.tvSignal.setText(deviceArrayList.get(position).getSignal() + "dBm");
}
return convertView;
}
static class ViewHolder
{
TextView tvName;
TextView tvAddress;
TextView tvSignal;
}
}
そして、それを使用するアクティビティ:
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);
}
}
};
}
ペアリングされたデバイスのリストが確実に読み込まれるように、使用可能なデバイスのリストからすべてをコメントしました。おそらくいくつかの参照が失われていると思いますが、リストの仕組みを完全には理解していないため、まだ見つけることができません。
.add()
問題は、両方のライトを設定しようとすると、実際にデバイスを呼び出すとリストに追加されますが(.size()
正しい番号が返されます)、最初のものは更新されません。