首先感谢所有让我的android开发冒险变得更加轻松的用户。不过,我遇到了一种情况,我没有找到解决方案,所以在这里:显示数据时ListFragment延迟
我有一个活动,其中包含旨在彼此交互的各种片段。这些包括:
包含由SimpleCursorAdapter从一个表中SQLite的分贝
// Grid Functionality public void PopulateGrid(){ dba = new myDB(getActivity().getApplicationContext()); dba.open(); Cursor c = dba.getRows(); if (c!=null){ String[] columns = new String[]{col_1, col_2, col_3, col_4}; int[] to = new int[]{R.id.grid_id, R.id.grid_desc, R.id.grid_value, R.id.grid_image}; newAdapter = new SimpleCursorAdapter(getActivity(), R.layout.grid_item, c, columns, to); View v = getView(); GridView gv = (GridView)v.findViewById(R.id.sale_grid); gv.setAdapter(newAdapter); gv.setOnItemClickListener(itemSelected); } }
一个ListFragment填充一个GridView一个片段,其由另一SimpleCursorAdapter从一个不同的表 //列表填充功能
public void PopulateList(int index){ Log.v("sell list", "Populate list started"); dba.open(); Cursor cursor = dba.getList(index); if (cursor!=null){ String[] columns = new String[]{col_1, col_2, col_3, col_4, col_5}; int[] to = new int[]{R.id.code, R.id.description, R.id.qty, R.id.price}; newAdapter = new SimpleCursorAdapter(getActivity(), R.layout.list_row, cursor, columns, to); this.setListAdapter(newAdapter); } dba.close(); }
当用户选择在GridView中,ACTI的东西vity将项目插入到ListView的表中,然后重新初始化它。
@Override public void onGridClicked(Long value) { insertItem(value.toString()); } //do stuff public void insertItem(String result) { // Add item dba.addItem(result, qty, index); //Re-populate Panels long start; long end; start = System.currentTimeMillis(); refreshPanels(index); end = System.currentTimeMillis(); Log.v("Refresh List:", "Time"+(end-start)); } private void refreshPanels(int index){ lf.PopulateList(index); ListView lv = lf.getListView(); lv.setSelection(lv.getCount()-1); }
现在的问题:当我查看日志和日志的每一步。整个过程不超过50-70毫秒,但从点击网格到更新ListView时,我可以从字面上计算2-3秒。 看来,问题在于ListFragment和如何才能setListAdapter()
并刷新视图的时间。
我已经尝试过不同的方法,例如1.使用接口来侦听选择或直接从GridView片段调用它2.调用ListFragment中的辅助函数newadapter.changecursor(c)
或newadapter.getCursor().requery()
3.其他这种变种...
但它似乎总是采取永远任何帮助,请..
使用Traceview识别您的难度来源。 http://developer.android.com/guide/developing/tools/traceview.html – CommonsWare 2011-05-18 00:08:29
@CommonsWare好的,我添加了一个traceview开始在GridView的itemselected监听器上,并在insertItem()完成后结束。这给我的执行时间仅为157ms,但是一旦这个过程完成后仍然有一个滞后,直到它在屏幕上显示 – connoisseur 2011-05-18 21:42:57
加载内容该窗口中不会被调用查询。当Android开始使用你的SimpleCursorAdapter时,它会被调用。要强制查询您所需的窗口期间发生,调用'getCount将()'对内部的''SimpleCursorAdapter' PopulateList()'。顺便说一句,Java约定是方法名称为'camelCaseWithLeadingLowercaseLetter()'。 – CommonsWare 2011-05-18 22:09:22