Android - 在表加载后添加表行

时间:2013-06-25 05:41:30

标签: java android android-layout

我正在阅读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上显示它[附加到表格],我怎么能这样做?[滚动和所有我会照顾]请让我知道 我已尝试使用线程,但没有使用

2 个答案:

答案 0 :(得分:1)

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

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

一旦确定了提取策略,就需要实现实际的适配器和列表视图。这是一个good technique来执行此操作。我建议您不要重新发明轮子并使用这个名为EndlessAdapter的伟大库,除非您想将其用于学习目的。

答案 1 :(得分: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();
                        }
                    }
                }
            }
        });
    }

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