0

我正在读取 UDP 数据包,我想在 UI 上将该信息显示为 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 上显示它[附加到表格],我该怎么做??[滚动和我会照顾的一切] 请让我知道 我已经尝试过使用线程但没有用

4

2 回答 2

1

基本上,您需要实现一个无限列表视图。有几种策略可以做到这一点:

  • 您可以获取所有数据并将其存储在数据库中,并且一次只向用户显示 50 个。
  • 您一开始只能获取 50 个,然后在用户滚动过去时获取下一个 50 个。
  • 您可以获取 100,显示 50,然后当用户滚动超过前 50 个时显示下一个 50。预获取下一个 100 以显示下一个,依此类推。

一旦确定了获取策略,就需要实现实际的适配器和列表视图。这是一个 很好的技术来做到这一点。我建议您不要重新发明轮子并使用这个名为EndlessAdapter的出色库,除非您想实现它以用于学习目的。

于 2013-06-25T06:11:59.877 回答
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();
                        }
                    }
                }
            }
        });
    }

最后我想说的是,复制粘贴可能会得到你想要的结果,但它会阻碍你未来的能力。我会说学习,阅读,学习,尝试,失败,然后再试一次。

于 2013-06-25T06:39:27.163 回答