2014-03-06 100 views
0

我正在開發一個能夠檢測BLE信號並將它們列在ListView中的android應用程序。掃描一段時間後,它將停止掃描。下面是代碼(這是一樣的,在開發者頁面):如何將ListView保存到Android中的xml文件中?

ScanBleActivity.class(從ScanBaseActivty擴展):

public class ScanBleActivity extends ScanBaseActivity { 

private BluetoothAdapter mBluetoothAdapter; 
private boolean mScanning; 
private Handler mHandler = new Handler(); 


// Stops scanning after 10 seconds. 
private static final long SCAN_PERIOD = 20000; 

    /* (non-Javadoc) 
    * @see com.zishao.bletest.ScanBaseActivity#initScanBluetooth() 
    */ 
protected void initScanBluetooth() { 
    BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = manager.getAdapter(); 
    startScanLen(true); 
    } 

    @Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mScanning) { 
    startScanLen(false); 
    } 
} 

    /** 
    * 
    * @param enable 
    */ 

    private void startScanLen(final boolean enable) { 
    if (enable) { 
     // Stops scanning after a pre-defined scan period. 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mScanning = false; 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      } 
     }, SCAN_PERIOD); 

     mScanning = true; 
     mBluetoothAdapter.startLeScan(mLeScanCallback); 
    } else { 
     mScanning = false; 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
} 

// Device scan callback. 
private BluetoothAdapter.LeScanCallback mLeScanCallback = 
    new BluetoothAdapter.LeScanCallback() { 
     @Override 
     public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
      addDevice(device, rssi); 

     } 
    }; 

的AddDevice在其他類中實現的,在這種情況下ScanBaseActivity:

ScanBaseActivity(其從ListActivity延伸):

abstract public class ScanBaseActivity extends ListActivity { 

protected LeDeviceListAdapter mLeDeviceListAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_devices_scan); 
mLeDeviceListAdapter = new LeDeviceListAdapter(this, new ArrayList<BluetoothDevice>()); 
this.setListAdapter(mLeDeviceListAdapter); 
initScanBluetooth(); 
} 

/** 
* Start Scan Bluetooth 
* 
*/ 
abstract protected void initScanBluetooth(); 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
BluetoothDevice device = (BluetoothDevice) mLeDeviceListAdapter.getItem(position); 
ParcelUuid[] uuids = device.getUuids(); 
String uuidString = "Getting UUID's from " + device.getName() + ";UUID:"; 
if (null != uuids && uuids.length > 0) { 
    uuidString += uuids[0].getUuid().toString(); 
} else { 
    uuidString += "empty"; 
} 
Toast.makeText(this, uuidString, Toast.LENGTH_LONG).show(); 
} 

    /** 
    * @param device 
    */ 

protected synchronized void addDevice(final BluetoothDevice device, final int rssi) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mLeDeviceListAdapter.addDevice(device, rssi); 
      mLeDeviceListAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 
} 

所有I檢測的信息(姓名,地址,RSSI等等)被列在列表視圖。對於ListView,我實現了一個名爲BaseAdapter的Adapter。適配器的部分代碼如下:

public class LeDeviceListAdapter extends BaseAdapter { 
private List<BluetoothDevice> data; 
private Activity context; 
private final HashMap<BluetoothDevice, Integer> rssiMap = new HashMap<BluetoothDevice, Integer>(); 



public LeDeviceListAdapter(Activity context, List<BluetoothDevice> data) { 
    this.data = data; 
    this.context = context; 
} 

public synchronized void addDevice(BluetoothDevice device, int rssi) { 
    if(!data.contains(device)){ 
    data.add(device); 
    } 
    rssiMap.put(device, rssi); 
} 

@Override 
public int getCount() { 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 
    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (null == convertView) { 
     LayoutInflater mInflater = 
      (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = mInflater.inflate(R.layout.leaf_devices_list_item, null); 
     convertView.setTag(new DeviceView(convertView)); 
    } 
    DeviceView view = (DeviceView) convertView.getTag(); 
    view.init((BluetoothDevice) getItem(position), null); 
    return convertView; 
} 

public class DeviceView { 



    private TextView title; 
    private TextView status; 
    private TextView type; 
    private TextView address; 
    private TextView rssivalue; 

    public DeviceView(View view) { 
     title = (TextView) view.findViewById(R.id.device_name); 
     status = (TextView) view.findViewById(R.id.device_status_txt); 
     type = (TextView) view.findViewById(R.id.device_type_txt); 
     address = (TextView) view.findViewById(R.id.device_address_txt); 
     rssivalue = (TextView) view.findViewById(id.signal_intensity_txt); 
    } 

掃描完成後,我想給ListView保存到一個文件中(如果有可能進入一個xml文件),但我不知道在哪裏以及我應該在項目中使用哪些代碼來保存它。在文件中使用時間戳以瞭解它何時被保存也是很重要的。任何人都可以幫助我或給我任何線索?

新增功能:編輯代碼以顯示來自ScanBaseActivity和ScanBleActivity的所有代碼!

+0

你是什麼意思「列表視圖保存到文件」是什麼呢? – pelotasplus

+0

我的應用程序在掃描期間檢測到Listview BLE信號(顯示更多信息)。我想要做的是將所有已顯示的項目/信息保存到文件中。這更清楚嗎? – user3365807

+0

您不要「將ListView保存到文件中」。將*模型數據*保存到文件中。 – CommonsWare

回答

0

我看到你的構造函數有一個問題。

public LeDeviceListAdapter(Activity context, List<BluetoothDevice> data) { 
    //EDIT:: 
    //add the following line 
    super(context, R.layout.leaf_devices_list_item, data); 

    this.data = data; 
    this.context = context; 

} 

調用超級構造函數將數據引用傳遞給BaseAdapter。然後,BaseAdapter將能夠處理列表中的任何更改。

+0

當我把這條線告訴我缺少的時候,會發生以下錯誤:「構造函數調用必須是構造函數中的第一條語句」。沒有這條線我的應用程序是完美的。但關於我的這個線程的問題,你知道列表視圖的每個項目的所有信息如何進入一個文件? – user3365807

+0

對不起,我的壞。我編輯了我的答案,它將修復錯誤。就保存到文件而言,我會建議使用數據庫或SharedPreferences。 – novic3

+0

它仍然給我一個問題:「構造函數BaseAdapter(Activity,int,List )未定義」。正如我之前告訴過你的,該應用程序運行良好。我使用另一個類來實現BaseAdapter。 – user3365807

0

我打算在這裏做一些假設,所以糾正我,如果我錯了。 您可以從正在掃描設備的類訪問適配器。我假設你是這樣使用添加設備將設備添加到適配器的。通過在返回BluetoothDevice列表的適配器上創建公共方法,您可以在掃描完成時從此處撥打適配器以獲取已存儲的設備列表。 您擁有的第二個選項是隻要將設備添加到列表中,就在適配器中創建所需的xml文件。應該沒有太多的設備,所以你應該有一個相當少的讀寫。寫入XML文件應遵循此答案中的過程。 Android creating and writing xml to file

(編輯) 你會在看類似:

public void run() { 
       mScanning = false; 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
       //Add the call here to save the file 
       // You should be able to access the list adapter from your base class 
       // that will give you the devices 
      } 
     }, SCAN_PERIOD); 
+0

你非常接近,但addDevice是在其他類(本例中爲ScanBaseActivity)中實現的,但是您已經告訴(我修改了代碼以引入其他類)。我不太瞭解你正在嘗試怎麼做,就像你告訴我的一樣。我應該在哪裏編寫用於創建文件和保存列表的代碼?我應該如何寫或應該使用哪些命令?對不起,但我還沒有創建/寫作,我有點失落。 – user3365807

+0

如果可能,我將需要完成掃描完成後的第一個方法,它會保存列表。我應該在StartScanLen中,在運行方法中執行此操作,否則? – user3365807

+0

是的,您可以在postDelayed處理程序的運行方法中執行此操作。掃描週期結束後我們將取消掃描。此時,適配器應具有所有藍牙設備的詳細信息,我們可以從中獲取該列表。 – Zomb

相關問題