我正在阅读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上显示它[附加到表格],我怎么能这样做?[滚动和所有我会照顾]请让我知道 我已尝试使用线程,但没有使用
答案 0 :(得分:1)
基本上,您需要实现无限列表视图。有几种策略可以做到这一点:
一旦确定了提取策略,就需要实现实际的适配器和列表视图。这是一个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();
}
}
}
}
});
}
最后我想说复制粘贴可能会让你得到你想要的结果,但它会阻碍你未来的能力。我会说学习,阅读,学习,尝试,失败,然后再试一次。