2013-03-17 88 views
1

我有一個活動2個Listviews- PairedListView和NewDevicesListView和一個scanbutton。最初,onCreate()該活動應顯示所有藍牙配對設備和掃描按鈕。按下「掃描」按鈕後,它應該顯示第二個列表視圖和新設備。爲此,我使用了多個線性佈局。但是,我的問題是這兩個列表都沒有顯示任何項目。Android多個Listviews對單個活動沒有顯示項目

這裏是於版圖

<devicelist.layout> 
       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical" 
       tools:context=".DeviceList" 
       tools:ignore="ExtraText" > 

       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_weight="1" > 

       <TextView android:id="@+id/title_paired_devices" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/title_paired_devices" 
        android:visibility="gone" 
        android:background="#666" 
        android:textColor="#fff" 
        android:paddingLeft="5dp" 

       /> 
       <ListView android:id="@+id/paired_devices" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:stackFromBottom="true" 


       /> 
      </LinearLayout> 

      <LinearLayout android:layout_weight="1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

       <TextView android:id="@+id/title_new_devices" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/title_other_devices" 
        android:visibility="gone" 
        android:background="#666" 
        android:textColor="#fff" 
        android:paddingLeft="5dp" 
       /> 
       <ListView android:id="@+id/new_devices" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:stackFromBottom="true" 

       /> 
       </LinearLayout> 

       <Button android:id="@+id/button_scan" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/button_scan" 

       /> 


      </LinearLayout> 

,這裏是Java類

<devicelist.java> 
       package org.example.spark; 

      import java.util.Set; 

      import android.app.Activity; 
      import android.bluetooth.BluetoothAdapter; 
      import android.bluetooth.BluetoothDevice; 
      import android.content.BroadcastReceiver; 
      import android.content.Context; 
      import android.content.Intent; 
      import android.content.IntentFilter; 
      import android.os.Bundle; 
      import android.view.Menu; 
      import android.view.View; 
      import android.view.View.OnClickListener; 
      import android.view.Window; 
      import android.widget.AdapterView; 
      import android.widget.AdapterView.OnItemClickListener; 
      import android.widget.ArrayAdapter; 
      import android.widget.Button; 
      import android.widget.ListView; 
      import android.widget.TextView; 


      public class DeviceList extends Activity { 
        // Return Intent extra 
       public static String EXTRA_DEVICE_ADDRESS = "device_address"; 

       // Member fields 
       private BluetoothAdapter mBtAdapter; 
       private ArrayAdapter<String> mPairedDevicesArrayAdapter; 
       private ArrayAdapter<String> mNewDevicesArrayAdapter; 
       @Override 
       protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

        // Setup the window 
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
        setContentView(R.layout.activity_devicelist); 

        // Set result CANCELED incase the user backs out 
        setResult(Activity.RESULT_CANCELED); 


        // Initialize the button to perform device discovery 
        Button scanButton = (Button) findViewById(R.id.button_scan); 
        scanButton.setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          doDiscovery(); 
         v.setVisibility(View.GONE); 
        } 
        }); 

        // Initialize array adapters. One for already paired devices and 
        // one for newly discovered devices 
       mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 
       mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 

        // Find and set up the ListView for paired devices 
        ListView pairedListView = (ListView) findViewById(R.id.paired_devices); 
        pairedListView.setAdapter(mPairedDevicesArrayAdapter); 
       pairedListView.setOnItemClickListener(mDeviceClickListener); 

        // Find and set up the ListView for newly discovered devices 
       ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); 
       newDevicesListView.setAdapter(mNewDevicesArrayAdapter); 
       newDevicesListView.setOnItemClickListener(mDeviceClickListener); 

        // Register for broadcasts when a device is discovered 
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
        this.registerReceiver(mReceiver, filter); 

        // Register for broadcasts when discovery has finished 
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
        this.registerReceiver(mReceiver, filter); 

        // Get the local Bluetooth adapter 
        mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 

        // Get a set of currently paired devices 
        Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); 

        // If there are paired devices, add each one to the ArrayAdapter 
       if (pairedDevices.size() > 0) { 
        findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 
        for (BluetoothDevice device : pairedDevices) { 
       mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
      } } 
       else { 
       String noDevices = getResources().getText(R.string.none_paired).toString(); 
        mPairedDevicesArrayAdapter.add(noDevices); 
       } 
       } 

       @Override 
       protected void onDestroy() { 
        super.onDestroy(); 

        // Make sure we're not doing discovery anymore 
        if (mBtAdapter != null) { 
         mBtAdapter.cancelDiscovery(); 
        } 

        // Unregister broadcast listeners 
        this.unregisterReceiver(mReceiver); 
       } 

       /** 
       * Start device discover with the BluetoothAdapter 
       */ 
       private void doDiscovery() 
       { 


        // Indicate scanning in the title 
        setProgressBarIndeterminateVisibility(true); 
        setTitle(R.string.scanning); 

        // Turn on sub-title for new devices 
        findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE); 

        // If we're already discovering, stop it 
        if (mBtAdapter.isDiscovering()) 
        { 
         mBtAdapter.cancelDiscovery(); 
        } 

        // Request discover from BluetoothAdapter 
        mBtAdapter.startDiscovery(); 
       } 

       // The on-click listener for all devices in the ListViews 
       private OnItemClickListener mDeviceClickListener = new OnItemClickListener() { 
        public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) { 
         // Cancel discovery because it's costly and we're about to connect 
         mBtAdapter.cancelDiscovery(); 

         // Get the device MAC address, which is the last 17 chars in the View 
         String info = ((TextView) v).getText().toString(); 
         String address = info.substring(info.length() - 17); 

         // Create the result Intent and include the MAC address 
         Intent intent = new Intent(); 
         intent.putExtra(EXTRA_DEVICE_ADDRESS, address); 

         // Set result and finish this Activity 
         setResult(Activity.RESULT_OK, intent); 
         finish(); 
        } 
       }; 

       // The BroadcastReceiver that listens for discovered devices and 
       // changes the title when discovery is finished 
       private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         String action = intent.getAction(); 

         // When discovery finds a device 
         if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
          // Get the BluetoothDevice object from the Intent 
         BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
          // If it's already paired, skip it, because it's been listed already 
       if(device.getBondState()!= BluetoothDevice.BOND_BONDED) 
        mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 

         // When discovery is finished, change the Activity title 
       } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
        setProgressBarIndeterminateVisibility(false); 
        setTitle(R.string.select_device); 
          if (mNewDevicesArrayAdapter.getCount() == 0) { 
        String noDevices = getResources().getText(R.string.none_found).toString(); 
       mNewDevicesArrayAdapter.add(noDevices); 
          } 
         } 
       } 
       }; 





       @Override 
       public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.activity_devicelist, menu); 
        return true; 
       } 

      } 

能ANY1請告訴我在哪裏可以去錯了?

編輯

嘿,我修改了代碼爲兩個適配器如下..這是正確的方式?我試圖運行後修改仍然沒有顯示的項目..

     // Get a set of currently paired devices 
        Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); 

        // If there are paired devices, add each one to the ArrayAdapter 
       if (pairedDevices.size() > 0) { 
        findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 
        for (BluetoothDevice device : pairedDevices) { 
       mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       mPairedDevicesArrayAdapter.notifyDataSetChanged(); } 

回答

1

你應該做類似下面的代碼的東西。

http://developer.android.com/reference/android/widget/ArrayAdapter.html。看看.documentation更多信息

public class YourActivity extends Activity 
{ 
private ListView lv; 
public void onCreate(Bundle saveInstanceState) { 
     setContentView(R.layout.your_layout); 
    lv = (ListView) findViewById(R.id.your_list_view_id); 
    // populate arraylist with string data 
    ArrayList<String> your_array_list = new ArrayList<String>(); 
    your_array_list.add("foo"); 
    your_array_list.add("bar"); 

    // This is the array adapter, it takes the context of the activity as a first // parameter, the type of list view as a second parameter and your array as a third parameter 
    ArrayAdapter<String> arrayAdapter =  
    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, your_array_list); 
    lv.setAdapter(arrayAdapter); 
} 
} 

編輯

您可以在掃描設備爲您的數組列表添加數據。

notifyDataSetChanged() 通知附加的觀察者,底層數據已被更改,並且任何反映數據集的視圖都應刷新自身。

獲取新數據後,您可以通過調用適配器上的notifyDataSetChanged()來更新listview。

+0

嘿,這是在萬一我們已經有一系列物品了嗎?但在應用程序中,陣列在發現藍牙設備時動態增長。 – Meeshu 2013-03-17 08:45:57

+1

在添加項目之後,執行arrayAdapter.notifyDataSetChanged(); – greenapps 2013-03-17 09:52:05

+0

謝謝..我會試試這個,並檢查:) – Meeshu 2013-03-17 13:27:09

相關問題