【问题标题】:How to refresh automatically ListView in my app?如何在我的应用程序中自动刷新 ListView?
【发布时间】:2018-06-27 10:11:24
【问题描述】:

我正在构建一个可以从 BLE 设备下载一些数据的活动。现在,我想在我的活动的 ListView 中实时获取这个值。 但我无法做到这一点。这是我的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ble);

        listView = (ListView) findViewById(R.id.list_view);
        listView.setOnScrollListener(new OnListListener());
        adapter = new SensorDataAdapter(classe, R.layout.sensordata_row, new LinkedList<SensorData>());
        listView.setAdapter(adapter);
        refreshListViewByPosition(null);
        adapter.notifyDataSetChanged();
}

public void refreshListViewByPosition(Integer pos) {
        String tipoCaratteristica=null;
        if(pos!=null && pos ==0)
            tipoCaratteristica = CHARACTERISTIC_FORZA_STRING;
        else if(pos!=null && pos ==1)
            tipoCaratteristica = CHARACTERISTIC_TEMPERATURA_STRING;
        listaDati = db.fetchSensorData(tipoCaratteristica);
        if(listaDati== null || listaDati.size() == 0){
            listaDati = new LinkedList<SensorData>();
            SensorData s = new SensorData("NESSUN ELEMENTO MEMORIZZATO");
            listaDati.add(s);
        }
        adapter.getLista().clear();
        adapter.getLista().addAll(listaDati);
        // fire the event
        adapter.notifyDataSetChanged();
    }

现在,当我检索特征值时,我有 thid 代码:

@Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            //RECUPERO IL CORPO DEL MESSAGGIO
            try{
                ByteBuffer buffer = ByteBuffer.wrap(characteristic.getValue()).order(ByteOrder.LITTLE_ENDIAN);

                byte[] value=buffer.array();

                int valore1 = new Integer(value[3]) * 256 + new Integer(value[2]);
                int valore2 = new Integer(value[5]) * 256 + new Integer(value[4]);
                int valore3 = new Integer(value[7]) * 256 + new Integer(value[6]);
                int valore4 = new Integer(value[9]) * 256 + new Integer(value[8]);
                int valore5 = new Integer(value[11]) * 256 + new Integer(value[10]);
                int valore6 = new Integer(value[13]) * 256 + new Integer(value[12]);
                int valore7 = new Integer(value[15]) * 256 + new Integer(value[14]);
                int valore8 = new Integer(value[17]) * 256 + new Integer(value[16]);

        SensorData mSenData = new SensorData(contatore,valore1+"",valore2+"",valore3+"",
                        valore4+"",valore5+"",valore6+"",valore7+"",valore8+"",
                        Constants.CHARACTERISTIC_FORZA_STRING,
                        db.getDateTime(true));
                mSenData.setValueTimestamp(db.getDateTime(true));

                refreshListView(mSenData);

                db.insertSensorData(mSenData);
            }catch(Exception e){
                Log.e(TAG, e.getMessage());
            }

        }

在这个方法中我有 refreshListView 方法,我传递给它,新的 SensorData 对象。方法是这样的:

public void refreshListView(SensorData newRelevation) {
        adapter.getLista().add(0,newRelevation);
        adapter.notifyDataSetChanged();
    }

但是如果我尝试启动这段代码,我没有任何错误但列表视图不会自动刷新。

假设我每 5 到 10 毫秒收到一个新值。

【问题讨论】:

  • 您的 BLE 设备是否通知特性已更改?
  • 通过 Ble 流媒体
  • 你试过调试吗?它会触发onCharacteristicChanged吗?
  • 是的,数据已正确存储在我的数据库中
  • 您可能应该在 UI 线程上调用 refreshListView。我不确定在哪个线程上调用onCharacteristicChanged

标签: android listview bluetooth-lowenergy


【解决方案1】:

我建议使用ScheduledExecutorService,因为它非常准确,并且可以将 UI 卸载到线程。这是一个例子:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool( 1 );

然后调用这个函数:

 private final int INTERVAL = 1000; // milli-seconds

private void scheduleAtFixedRate() {
    final Runnable r = new Runnable() {
        public void run() {
            adapter.notifyDataSetChanged();
        }
    };
    scheduler.scheduleAtFixedRate(r, 0, INTERVAL , MILLISECONDS);
}

onDestroy 通话中:

scheduler.shutdown();

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多