在迭代另一个游标时访问游标无法及时传递数据

时间:2015-02-25 15:10:43

标签: android cursor spinner

我有一个数据库,食物显示在一个包含多达20行食物的桌布中。食物可以具有不同的测量单位,这些测量单位通过三个表中的联合选择查询来检索,并且在旋转器中针对表中的每个食物显示。当用户在微调器中选择一个测量单位时,光标移动到适当的位置,以便获得食物所选测量单位的营养成分(通过微调器的onItemSelected Listener)。

问题是当我从列表视图中选择食物记录以便在食物插入显示中更新它时,当我尝试重新创建食物记录时,迭代记录中的不同食物。当食物光标在食物行中时,它调用加载该特定食物的不同测量单位的方法,并且还选择记录的该食物的测量单位,我提醒您,在选择单位的库存移动到适当的专栏,以获得该单位的营养。

不幸的是,当foodCursor移动到下一行时,unitsCursor错过了及时传递数据并且食物行被部分填充。我无法弄清楚为什么会这样。下面是使用测量单位加载单位微调器的方法,以及在食物插入屏幕中重新创建食物记录的方法中的一些代码

protected void fillUnitsSpinner(String food) {
    unitsCursor = mDataBaseHelper.getFoodMatches(food, null, CURSOR_FOR_UNITS_SPINNER);

    foodUnits.clear();
    if(unitsCursor != null) {
        unitsCursor.moveToFirst();
        while(!unitsCursor.isAfterLast()) {
            // Get unit string
            String unit = unitsCursor.getString(unitsCursor.getColumnIndex(FoodDBHelper.UNITS));
            // Get practical units' extra columns if present
            String fingerTip = unitsCursor.getString(unitsCursor.getColumnIndex(
                    FoodDBHelper.FINGERTIP));
            // If practical units are present
            if(fingerTip != null) {
                foodUnits.add(FINGERTIP.getpUnit());
                foodUnits.add(FINGER.getpUnit());
                foodUnits.add(HAND.getpUnit());
                foodUnits.add(FIST.getpUnit());
                foodUnits.add(CUP.getpUnit());
            }
            else foodUnits.add(unit);
            unitsCursor.moveToNext();
        }
        unitsCursor.moveToFirst();

        ArrayAdapter<CharSequence> unitsAdapter = new ArrayAdapter<CharSequence>(this,
                R.layout.food_act_units_spinner_dropdown_item);
        unitsAdapter.addAll(foodUnits); // load adapter with food units
        unitsAdapter.setDropDownViewResource(R.layout.food_act_units_spinner_dropdown_item);
        mUnitsSpinner.setAdapter(unitsAdapter); // set adapter
        Log.i(TAG, "spinnerItem = " + unitsAdapter.getItem(foodUnits.indexOf(foodUnits.get(0))));
        // Select and set unit from the main table to the spinner
        if(!editRecord)
            mUnitsSpinner.setSelection(unitsAdapter.getPosition(foodUnits.get(0)));

        mUnitsSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int pos, long id) {
                Log.i(TAG, "pos = " + pos);
                TextView unitsText = (TextView) view.findViewById(R.id.f_a_units_item);
                int pUnitsPos = -1;
                String pShortcutUnit;

                switch(pos) {
                case MAIN_TABLE:
                    unitsCursor.moveToPosition(MAIN_TABLE);
                    break;
                // other cases



                String unitsChoice = unitsText.getText().toString();
                assigned = getValuesFromCursor(unitsCursor, unitsChoice);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // do nothing
            }




        });
    }
}

和...

// Fill foodTable with records
    if(c != null && c.moveToFirst()) {
        Log.i(TAG, "c.getCount = " + c.getCount());
        while(!c.isAfterLast() && makeRow(c)) {
            c.moveToNext();
        }

    }       
    setListenersToFoodRows();
    foodTable.requestLayout();

在makeRow(Cursor c)方法中,调用fillUnitsSpinner(foodName);

1 个答案:

答案 0 :(得分:0)

我终于解决了它。问题是我使用类变量作为unitsCursor,而正确的是使用实例 变量