Android_AutoRoom 4

yoohm發表於2017-10-15

Android_AutoRoomApp4

下拉切換(效率更高) + 資料更新 + 下拉重新整理 + RadioButton的圖片設定(美化)

難點:資料更新

  1. 下拉切換

    • 第一次是自己通過迴圈來實現,效率很低。

      • 問題

        • new直接賦值 的區別

      直接賦值是賦值地址過去,假如a,b指向*一個資料的記憶體地址,那麼清除b*,記憶體地址的資料也會被清楚,即a也會為空

      List<String> a = new List<>();
      List<String> b = a;
      a == b is true;
      
      List<String> c = new List<>();
      c.addAll(a);
      a == c is false;
      
      // 結論
      a = b = 6;
      if clear(b);
      then a == null;
    • 後來與伺服器端約定好,傳遞相應的格式的json解決

    • 經過格式的轉換後,效率能夠得到提升

          // 下拉框選項
          spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
              @Override
              public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // position後期進行資料更新是需要
                  floorPosition = position;
                // 解決指向同一地址的問題
                  classroomBeanList.removeAll(classroomBeanList);
                // 該list為傳遞過來的資料  
                tempList = buildingBean.getFloor().get(position);
                // 替換recyclerview中的資料  
                classroomBeanList.addAll(tempList);
                // 通知佈局進行更新  
                adapter.notifyDataSetChanged();
              }
    
    
              @Override
              public void onNothingSelected(AdapterView<?> parent) {
    
              }
          });

  2. 資料更新

    • 問題:

      • 什麼時候進行資料更新?

      • 主動重新整理的時候(下滑重新整理)

      • 退出去當前頁面的時候,即執行onstart()方法更新資料
    • 資料如何儲存?

    這裡花了很長的時間想了如何使用資料庫來儲存,但是還是有問題,後來換種想法使用sp來進行更新

    其實有的時候這個方法不行外面可以換種方法來解決同一個問題。總之,我們得相信

    方法總比困難多

    * 儲存到資料庫(有一定困難,棄用。使用[litepal](https://github.com/LitePalFramework/LitePal)但是存在問題,暫時不用)
    * 儲存到sp(選用這個)
    
    • 實現

      • MainPagerActivity 中重寫 onStart, 再次傳送請求
      @Override
      public void onStart() {
          Log.d(TAG, "onStart: onStart ~");
          super.onStart();
          // 1. 獲取賬號和密碼, 是為了能夠再次進行請求
          String usernameAndPassword = SPUtil.getInfoFromLocal(mContext,Constant.USERNAMEANDPASSWORD);
          username = usernameAndPassword.split(",")[0];
          password = usernameAndPassword.split(",")[1];
          // 2. 重新請求資料,並儲存
          rePost();
      }
    
    
      public void rePost(){
          Log.d(TAG, "rePost: 重新載入 。。。");
          OkHttpUtils
                  .post()
                  .url(Constant.URLLOGIN)
                  .addParams("username", username)
                  .addParams("password", password)
                  .build()
                  .execute(new StringCallback() {
                      @Override
                      public void onError(Call call, Exception e, int id) {
                          Log.d(TAG, "onError: ");
                          Toast.makeText(mContext,"網路異常,請稍後再試",Toast.LENGTH_SHORT).show();
                          return;
                      }
    
                      @Override
                      public void onResponse(String response, int id) {
                          Log.d(TAG, "onResponse: " + response);
                          try {
                              JSONObject jsonObject = new JSONObject(response);
                              String result = jsonObject.getString("result");
                              Log.d(TAG, "onResponse: "+ response);
                              if (result.equals("1")) { SPUtil.saveInfoToLocal(mContext,response,Constant.BUILDINGJSON);
                                  Total total = JSONUtils.parseTotalJSON(response);
                                  buildingList = total.getBuilding();
                              } else {
                                  String message = jsonObject.getString("message");
                                  Toast.makeText(mContext, message,Toast.LENGTH_SHORT).show();
                                  return;
                              }
                          } catch (JSONException e) {
                              e.printStackTrace();
                          }
                      }
                  });
      }

  3. 下拉重新整理

      <android.support.v4.widget.SwipeRefreshLayout
          android:id="@+id/srl_class_room"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
    
          <android.support.v7.widget.RecyclerView
              android:id="@+id/rv_class_room"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    
          </android.support.v7.widget.RecyclerView>
      </android.support.v4.widget.SwipeRefreshLayout>

    java程式碼

            // xia hua shua xin
        srl_class_room.setProgressBackgroundColorSchemeResource(android.R.color.white);
        srl_class_room.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
        srl_class_room.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                srl_class_room.setRefreshing(true);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 獲取新資料
                        reFresh();
                        // rePost();
                    }
                }).start();
            }
        });
  1. RadioButton圖片大小設定

    • 設定一個選擇器(selector_main_pager.xml),把圖片放進去
    • 然後在java程式碼中獲取資源,設定大小

selector_main_pager.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@mipmap/home" />
    <item android:state_checked="false" android:drawable="@mipmap/home" />
</selector>

在使用該RadionButton的佈局中使用如下程式碼

        // 使用上面的選擇器       
    Drawable drawable_Pager = getResources().getDrawable(R.drawable.selector_main_pager);
        drawable_Pager.setBounds(0,0,70,70);
        rg_main_pager.setCompoundDrawables(null,drawable_Pager,null,null);
  1. 遇見問題

    1. 記憶體溢位: 暫時少見,等下次出現解決

    載入過多的資料時候的確會出現記憶體溢位問題,應該是item載入太多圖片導致,等待解決中…

  2. 資料更新: litepal對於List是否支援?
  • 擴充套件:

    [java日期格式大全 format SimpleDateFormat](http://www.cnblogs.com/loveyakamoz/archive/2011/08/18/2145047.html)