0

我正在开发一个应用程序,我必须在其中连接到 Android 4.3 上的蓝牙设备。

我想每秒更新一次 Arraylist。

在我的应用程序中。DeviceControl.java将使用intent 和startActivity 传递参数。

Main.java将接收来自DeviceControl.java的参数并像下面的代码一样放入 Arraylist。

主.java

public class Main extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        onNewIntent(getIntent());

    }

    @Override
    protected void onNewIntent(Intent intent) {
        // TODO Auto-generated method stub
        super.onNewIntent(intent);
        setIntent(intent);

        for(int i = 0;i<5;i++)
        {
            if(address[i].length() != 1) {
                HashMap<String, Object> item = new HashMap<String, Object>();
                item.put("name", name[i]);
                item.put("address", address[i]);
                item.put("RSSI", rssi[i]);
                item.put("Battery", battery[i]);
                list.add(item);

                mdeviceAddress = address[i];

            } else if(address[i].length() == 1)
                    break;
        }

        mHandler.postDelayed(addlist, 1000); //update the list

        adapter = new SimpleAdapter(this, list, R.layout.device_list_name_address, 
                        new String[] {"name", "address", "RSSI", "Battery"},
                        new int[] {R.id.device_name, R.id.device_address, R.id.device_rssi, R.id.device_battery} );
        devicelist.setAdapter(adapter);


    }

但它只会在DeviceControl.java启动意图时更新一次列表。我希望它总是在DeviceControl.java启动意图后更新列表。

我曾尝试在 Runnable 中键入 Arraylist 的代码,但它不起作用。

我应该怎么做才能使 Arraylist 自动更新?

编辑

我添加了以下可运行的代码

final Runnable addlist = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for(int i = 0;i<5;i++)
            {
                if(address[i].length() != 1){
                    ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String,Object>>();
                    HashMap<String, Object> item = new HashMap<String, Object>();
                    item.put("name", name[i]);
                    item.put("address", address[i]);
                    item.put("RSSI", "11111:" + rssi[i]);
                    item.put("Battery", "22222:" + battery[i]);
                    list.add(item);


                    Log.v(TAG, "onNewIntent----------------------------");
                    mdeviceAddress = address[i];
                    Log.v(TAG, "address[" + i + "] = " + address[i]);
                    Log.v(TAG, "GATT[" + i + "] = " + gatt[i]);
                    //並連線到此Address
                    Intent gattServiceIntent = new Intent(Main.this, BluetoothLeService.class);
                    registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
                    bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);

                }else if(address[i].length() == 1)
                    break;
            }
            adapter.notifyDataSetChanged();
            mHandler.postDelayed(this, 1500);
        }
    };

mHandler.postDelayed(addlist, 1000);在 for 循环后输入 OnNewIntent。该列表应该从

item.put("RSSI", rssi[i]);
item.put("Battery", battery[i]);

item.put("RSSI", "11111:" + rssi[i]);
item.put("Battery", "22222:" + battery[i]);

但这并没有改变什么。

4

2 回答 2

0

你有没有利用notifyDataSetChanged()来更新你的清单?

如果没有,那么你可以写成 adapter.notifyDataSetChanged()可运行的。这将更新您的列表。我希望这能帮到您。

于 2013-11-02T08:05:50.250 回答
0

请参阅演示http://xjaphx.wordpress.com/2011/07/15/listview-in-one-activity-doesnt-refresh-data-sending-another-activity/

我猜 notifyDataSetChanged() 不起作用,因为适配器指向“旧列表”,而不是“新列表”。不要创建新的 ArrayList,使用与适配器绑定的那个。
尝试这个:

ArrayList<HashMap<String, Object>> tmp = new ArrayList<HashMap<String,Object>>();
//set data
list.clear();
list.addAll(tmp);

希望有帮助。

于 2014-07-23T23:15:21.163 回答