-1
我正在創建一個Android應用程序,讓用戶可以選擇設備中的可用傳感器,並使用實際傳感器讀數列出所選傳感器。更改數據集時不從ListView中移除元素
這裏我使用一個自定義適配器來擴展BaseAdaptor
類。 我問了一個關於在數據集發生變化時實時更新列表視圖的問題,並且我能夠修復它。
方法我曾經解決它: -
- 定義有2成公田來存儲數據的公開課。哈希映射和列表(用於適配器)
- 當傳感器更改時,將傳感器值和傳感器名稱放到哈希映射中併發送廣播。
- 在廣播接收機類中,如果列表中有前面的記錄,請將其清除並將讀數放入列表中。
我適配器傳遞到傳感器讀數類,這樣我打電話adapter.notifydataSetChanged()
當傳感器改變。
這裏是我的源代碼。
傳感器讀取器類。 (
RealtimeSensor
是存儲所述傳感器數據的類)@Override public void onSensorChanged(SensorEvent event) { RealTimeSensor realTimeSensor = new RealTimeSensor(); realTimeSensor.setName(AvailableSensors.getType(event.sensor.getType()).toUpperCase()); realTimeSensor.setValueX(event.values[0] + ""); realTimeSensor.setValueY(event.values[1] + ""); realTimeSensor.setValueZ(event.values[2] + ""); TempStore.sensorDataMap.put(AvailableSensors.getType(event.sensor.getType()), realTimeSensor); Intent intent = new Intent(); intent.setAction("sensorDataMap"); context.sendBroadcast(intent); adaptor.notifyDataSetChanged(); }
廣播接收機類
@Override public void onReceive(Context context, Intent intent) { TempStore.realTimeSensors.clear(); TempStore.realTimeSensors.addAll(TempStore.sensorDataMap.values()); }
onDialogPositiveClick
方法SensorViewAdaptor adaptor1 = new SensorViewAdaptor(getApplicationContext(), TempStore.realTimeSensors); sensorReader = new RealTimeSensorReader(this, adaptor1); for (Sensor s : sensors) { sensorManager.registerListener(sensorReader, s, SensorManager.SENSOR_DELAY_NORMAL); } realTimeSensorChangeReceiver.updateOnChange(adaptor1); listView.setAdapter(adaptor1);
的適配器類
public class SensorViewAdaptor extends BaseAdapter { private Context context; private List<RealTimeSensor> data; public SensorViewAdaptor(Context context, List<RealTimeSensor> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view; if (convertView == null) { view = inflater.inflate(R.layout.display_sensor_values, parent, false); holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.name); holder.valuesX = (TextView) view.findViewById(R.id.X); holder.valuesY = (TextView) view.findViewById(R.id.Y); holder.valuesZ = (TextView) view.findViewById(R.id.Z); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } RealTimeSensor data = this.data.get(position); holder.name.setText(data.getName()); holder.valuesX.setText(data.getValueX()); holder.valuesY.setText(data.getValueY()); holder.valuesZ.setText(data.getValueZ()); return view; } private class ViewHolder { public TextView name; public TextView valuesX; public TextView valuesY; public TextView valuesZ; }
}
我的問題是,當我取消選擇所選擇的傳感器中的一個,它不會從視圖中移除。 這是什麼原因?
非常感謝。
使用'notifyDataSetChanged();' – Jas
當您取消選擇傳感器時,是否也將其從適配器列表中刪除? – Bhargav
順便說一句我認爲它更好地發送數據到廣播接收者的意圖額外的而不是存儲來自靜態變量的訪問數據 – Bhargav