2

同じアクティビティ レイアウトで同じ拡張を使用する 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()正しい番号が返されます)、最初のものは更新されません。

4

1 に答える 1

0

解決

などの再利用可能なクラスを作成するときは、決してローカル変数を に設定DeviceListBaseAdapterしないでください。そのオブジェクトのすべてのインスタンス間でこの特定の変数を共有することです。したがって、 の 2 つのインスタンスがありましたが、1 つしかないため、一度に 1 つのリストしか機能しませんでした。高速のコピペに注意してください。staticstaticDeviceListBaseAdapterdeviceArrayList

于 2012-09-08T14:50:11.387 に答える