1. 程式人生 > >fragment 中adapter資料無法顯示問題

fragment 中adapter資料無法顯示問題

private synchronized void update() {
    if (currentApn != null && !listAll.contains(currentApn)) {
        listAll.add(0, currentApn);
        apnAdapter = new ApnAdapter(getActivity(), listAll, listener);
        apnAdapter.setSelectItem(0);
    } else {
        apnAdapter = new ApnAdapter(getActivity(), listAll, listener);
    }
    apn_list.setAdapter(apnAdapter);
    
}

很簡單的一段程式碼,但是發現有的地方能顯示,有的地方不能顯示,很奇怪,查看了網上很多文章,沒有找到問題所在

通過列印定位,確定資料是不為空的,所以不是資料問題。

然後對比發現,能顯示和不能顯示的區別,終於發現了問題

 update只是一個方法,能否顯示要看在哪呼叫的這個方法,不能顯示是因為在子執行緒呼叫了這個方法,所以修改很簡單,可以通過handler 訊息機制來實現,或者簡單處理如下

private synchronized void update() {
    if (currentApn != null && !listAll.contains(currentApn)) {
        listAll.add(0, currentApn);
        apnAdapter = new ApnAdapter(getActivity(), listAll, listener);
        apnAdapter.setSelectItem(0);
    } else {
        apnAdapter = new ApnAdapter(getActivity(), listAll, listener);
    }
    if (Looper.myLooper() != Looper.getMainLooper()){//非主執行緒
        if (App.isBluetoothConnection) {
          activity2.runOnUiThread(new Runnable() {
              @Override
              public void run() {
                  apn_list.setAdapter(apnAdapter);
              }
          });
        }
    }else{
        apn_list.setAdapter(apnAdapter);
    }
}