2013-06-25 45 views
0

我正在讀取UDP數據包,並且我想在UI上顯示該信息作爲android應用程序中的表格。 這裏是我的代碼,Android - 在表格加載後添加表格行

try { 
      byte buffer[] = new byte[10000];<br/> 
      InetAddress address = InetAddress.getByName("192.168.xx.xx");<br/> 
      int port = xxx;<br/> 
      Log.d("..........","What will Happen ?? ");<br/> 
      for(int k=0;k<50;k++) { // 50 rows are added , This i wanna make it 5000+ rows so it takes plenty of time to load that table <br/> 
       DatagramPacket p = new DatagramPacket(buffer, buffer.length, address, port);<br/> 
       DatagramSocket ds = new DatagramSocket(port);<br/> 
       Log.d("..........","Perfect Binding .... Waiting for Data");<br/> 
       ds.receive(p);<br/> 
       Log.d("..........","Packet Received");<br/> 
       byte[] data = p.getData();<br/> 
       String result = "";<br/> 
       int b[] = new int[data.length];</br> 
       for (int i=0; i < 150; i++) {<br/> 
        result += Integer.toString((data[i] & 0xff) + 0x100, 16).substring(1);<br/> 
        result += "_";<br/> 
       }<br/> 

       Log.d("Result => ",result); <br/> 
       TableLayout tl=(TableLayout)findViewById(R.id.TableLayout01);<br/> 
       TableRow tr=new TableRow(this); 
       TextView tv= new TextView(this); 
       TextView tv2 = new TextView(this); 
       tv.setPadding(5, 0, 5, 0); 
       tv2.setPadding(5,0,5,0); 

       String k1 = Integer.toString(k); 
       tv.setText(k1); 
       tv2.setText(it_version); 
       tr.addView(tv); 
       tr.addView(tv2); 

       tl.addView(tr,1); 
       ds.close(); 
      }  


     } catch (Exception e) { 
      Log.e("UDP", "Client error", e); 
     } 

如果我保持50行我能夠沒有任何延時正常顯示了,如果我把3000行的服用時間過長,有時應用程序掛...我想補充50條目到一個表並加載表,並再次讀取50個條目,並追加到表中,而無需觸摸任何按鈕或任何東西,所以我有一個表中的UI,它會通過讀取UDP數據包自動更新...我怎麼能實現這一目標? ?任何線索讚賞。

或者一旦我讀取UDP數據包我想在UI上顯示它[附加到表格],我該如何做到這一點?[滾動和所有我會照顧]請讓我知道 我已經嘗試使用線程但沒有用

+0

請正確格式化您的代碼。 –

+0

是的......我現在格式化代碼@JonathonReinhart – Mahesh

+1

「我已經嘗試過使用線程但沒有用」你是什麼意思?你應該使用AsyncTask。 –

回答

1

基本上,你需要實現一個無限的listview。有幾個策略可以做到這一點:

  • 您可以獲取所有數據並將其存儲在數據庫中,並且一次只顯示用戶50。
  • 您可以首先抓取50個,然後在用戶滾動過去時抓取下一個50。
  • 您可以獲取100,顯示50,然後顯示下一個50,當用戶滾動過去前50時。預取下一個100以顯示下一個等等。

一旦你想出了你的抓取策略,你需要實現實際的適配器和列表視圖。這裏有一個good technique來做到這一點。我建議你不要重新發明輪子,並使用這個名爲EndlessAdapter的大型圖書館,除非你想爲學習目的實施它。

+0

再加上一句話說要使用已經存在的東西,但無限列表就是我通常喜歡自己創建的一件小事情。但我確實同意,對於像WheelView這樣更復雜的事情,只使用現有的庫會更好。 – WIllJBD

0

像這樣的東西就是你可能用來獲得無限列表效果,當你沒有遊標時。

請注意,這是一個非常粗略的草案,因爲我刪除了僅與我的應用程序相關的代碼,爲了幫助您清晰起見,以及我的隱私和應用程序隱私。它也許並不是做所有事情的最佳方式,但是它在我第一次寫它時運行(花了10分鐘),並且爲一個非常複雜的列表工作得很漂亮,所以我沒有反覆回過頭來。

class AsyncGetUpdates extends AsyncTask<Void, Void, List<UpdateDTO>> 
    { 

     @Override 
     protected void onPreExecute() 
     { 
      showDialog(); 
      super.onPreExecute(); 
     } 

     @Override 
     protected List<UpdateDTO> doInBackground(Void... params) 
     { 
      return APIHelper.getUpdates(count); 
     } 

     @Override 
     protected void onPostExecute(List<UpdateDTO> result) 
     { 
      killDialog(); 
      isCurrentlyUpdating = false; 
      setAdapterData(result); 
      super.onPostExecute(result); 
     } 
    } 

    public void setAdapterData(List<UpdateDTO> result) 
    { 
     killDialog(); 
     if (this != null && this.getActivity() != null) 
     { 
      Log.d(TAG, "setAdapterData"); 
      if (lvUpdatesList.getAdapter() != null) 
      { 
       // save index and top position 
       int index = lvUpdatesList.getFirstVisiblePosition(); 
       View v = lvUpdatesList.getChildAt(0); 
       int top = (v == null) ? 0 : v.getTop(); 

       updateListAdapter = new UpdateListAdapter(this.getActivity().getLayoutInflater(), result, this); 
       lvUpdatesList.setAdapter(updateListAdapter); 
       lvUpdatesList.refreshDrawableState(); 

       lvUpdatesList.setSelectionFromTop(index, top); 
      } 
      else 
      { 
       updateListAdapter = new UpdateListAdapter(this.getActivity().getLayoutInflater(), result, this); 
       lvUpdatesList.setAdapter(updateListAdapter); 
       lvUpdatesList.refreshDrawableState(); 
      } 
     } 

     // add in a listener to know when we get to the bottom 
     lvUpdatesList.setOnScrollListener(new OnScrollListener() 
     { 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) 
      { 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
      { 
       // we do not want to update if we already are 
       if (isCurrentlyUpdating == false) 
       { 
        if (lvUpdatesList.getAdapter() != null && lvUpdatesList.getAdapter().getCount() == count) 
        { 
         final int lastItem = firstVisibleItem + visibleItemCount; 
         if (lastItem == totalItemCount) 
         { 
          isCurrentlyUpdating = true; 
          // add to the count of views we want loaded 
          count += 20; 
          // start a update task 
          new AsyncGetUpdates().execute(); 
         } 
        } 
       } 
      } 
     }); 
    } 

最後我想說複製粘貼可能會得到你想要的結果,但它會阻礙你未來的能力。我會說學習,閱讀,學習,嘗試,失敗,然後再試一次。

+0

感謝您的幫助...將檢查並讓您知道狀態...再次感謝 – Mahesh