0

首先感谢所有让我的 android 开发冒险变得如此轻松的用户。但是,我遇到了一种我找不到解决方案的情况,所以这里是:

我有一个包含各种片段的活动,这些片段旨在相互交互。这些包括:

  1. 包含 GridView 的 Fragment 由 Sqlite db 中的一个表中的 SimpleCursorAdapter 填充

    // 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);
    
    }
    }
    
  2. 由另一个表中的另一个 SimpleCursorAdapter 填充的 ListFragment // 列表功能

    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();
    
    }
    
  3. 当用户从 GridView 中选择某些内容时,Activity 会将该项插入到 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 毫秒,但从我单击 Grid 到更新 ListView 的时间,我可以计算 2-3 秒。似乎问题在于 ListFragmentsetListAdapter()以及刷新视图所需的时间。

我已经尝试了各种方法来解决这个问题,例如 1. 使用接口来监听选择或直接从 GridView 片段调用它 2. 使用其中一个newadapter.changecursor(c)或3 调用 ListFragment 中的辅助函数newadapter.getCursor().requery()3. 这个的其他变体......

但它似乎总是需要任何帮助。

4

2 回答 2

1

如果你让你的 SQLite 操作更快,UI 线程可以更快地更新 UI。使用beginTransaction(), setTransactionSuccessful, endTransaction().

于 2011-06-21T04:37:53.453 回答
0

感谢您的帮助,原来问题不在于加载数据的 ListView,而在于 GridView 注册点击的时间太长,请参阅主题 5197438 现在我得想办法解决它......

于 2012-03-18T17:06:33.393 回答