Вызывается неправильный метод

491
10 августа 2017, 21:56

В приложении на Android когда в фрагменте JournalFragment вызываешь контекстное меню у ListView lvJournal и выбераешь пункт Return преложение вызывает метод из фрагмента CompliteFragment в контекстном меню ListView lvComplite. Из-за чего так может происходить?

Код фрагмента с нужным меню:

public class JournalFragment  extends Fragment {
private ListView lvJournal;
private SimpleCursorAdapter scAdapter;
private static final int CM_RETURN_ID = 1;
private Cursor Jcursor;
private DBController dbController;
private UIController uiController;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v =  inflater.inflate(R.layout.fragment_journal, container, false);
    lvJournal = (ListView) v.findViewById(R.id.lvJournal);
    dbController = new DBController();
    uiController = new UIController();
    Jcursor = dbController.getAllData(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbJournal());
    Jcursor.moveToFirst();
    uiController.crListView(lvJournal, getActivity(), R.layout.db_item, Jcursor, getResources().getString(R.string.TactID), getResources().getString(R.string.NameObjective), R.id.tvTID, R.id.tvName);
    Jcursor.requery();
    registerForContextMenu(lvJournal);
    return v;
}
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, CM_RETURN_ID, 0, getResources().getString(R.string.return_str));
}
//контекстное меню для списа
public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == CM_RETURN_ID) {
        // Получает индифкатор элемента
        AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        //Добавляем елемнт в БД с заданиями в 1 табе
       // dbController.GenObjectiveMain(Jcursor,AppContext.getDbAdapterMain().getmDB());
        dbController.addRecT(AppContext.getDbAdapterMain().getmDB(),Jcursor.getInt(Jcursor.getColumnIndex(getResources().getString(R.string._id))),
                Jcursor.getString(Jcursor.getColumnIndex(getResources().getString(R.string.NameObjective))),
                Jcursor.getString(Jcursor.getColumnIndex(getResources().getString(R.string.Discription))),
                Jcursor.getInt(Jcursor.getColumnIndex(getResources().getString(R.string.TactID))));

        // Обновление курсора
        Jcursor.requery();
        return true;
    }
    return super.onContextItemSelected(item);
}
 }

Код фрагмента, метод которого вызывается вместо нужного:

 public class CompliteFragment extends Fragment {
private ListView lvComplite;
private SimpleCursorAdapter scAdapter;
private static final int CM_RETURN_ID = 1;
private static Cursor Ccursor;
private DBController dbController;
private UIController uiController;
public static Cursor getCcursor() {
    return Ccursor;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_complite, container, false);
    lvComplite = (ListView) v.findViewById(R.id.lvComplite);
    dbController = new DBController();
    uiController = new UIController();
    Ccursor = dbController.getAllData(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbComp());
    Ccursor.moveToFirst();
    uiController.crListView(lvComplite, getActivity(), R.layout.db_item, Ccursor, getResources().getString(R.string.TactID), getResources().getString(R.string.NameObjective), R.id.tvTID, R.id.tvName);
    Ccursor.requery();
    registerForContextMenu(lvComplite);
    lvComplite.setOnItemClickListener(new   AdapterView.OnItemClickListener(){
        public  void   onItemClick( AdapterView<?> parent,   View view ,
                                    int position,   long id )   {
            uiController.createInfoDialog(getActivity(),  Ccursor,
                    getResources().getString(R.string.dis_string),
                    getResources().getString(R.string.Discription),
                    getResources().getString(R.string.ok_string));
        }
    } );
    return v;
}
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, CM_RETURN_ID, 0, getResources().getString(R.string.return_str));
}
//контекстное меню для списа
public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == CM_RETURN_ID) {
        // Получает индифкатор элемента
        AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        dbController.GenirateObjective(Ccursor,AppContext.getDbAdapterMain().getmDB());

        // удоляет эту позицию по id
        dbController.delRec(AppContext.getDbAdapterMain().getmDB(),
                AppContext.getDbAdapterMain().getDbComp(),
                AppContext.getDbAdapterMain().getColumnId(),
                acmi.id);
        // Обновление курсора
      Ccursor.requery();
        return true;
    }
    return super.onContextItemSelected(item);
}
}

Класс с методами:

public class DBController implements CrudComand  {
@Override
public Cursor getAllData(SQLiteDatabase mDB, String tableName) {
    return mDB.query(tableName, null, null, null, null, null, null);
}
@Override
public void delRec(SQLiteDatabase mDB, String tableName, String columName, long id) {
    mDB.delete(tableName, columName + " = " + id, null);
}
@Override
public void delRec(SQLiteDatabase mDB, String tableName, String columName) {
    mDB.delete(tableName, columName, null);
}

@Override
public ContentValues addRec(int id, String name, String discription, int oid) {
    ContentValues cv = new ContentValues();
    cv.put(AppContext.getDbAdapterMain().getColumnId(), id);
    cv.put(AppContext.getDbAdapterMain().getColumnName(), name);
    cv.put(AppContext.getDbAdapterMain().getColumnDs(), discription);
    cv.put(AppContext.getDbAdapterMain().getColumnTid(), oid);
    return cv;
}
@Override
public void addRecTJ(SQLiteDatabase mDB,int id, String name, String  discription, int oid) {
      mDB.insert(AppContext.getDbAdapterMain().getDbTable(), null, addRec(id, name, discription, oid));
        mDB.insert(AppContext.getDbAdapterMain().getDbJournal(), null, addRec(id, name, discription, oid));
}
@Override
public void addRecT(SQLiteDatabase mDB,int id, String name, String discription, int oid) {
    mDB.insert(AppContext.getDbAdapterMain().getDbTable(), null, addRec(id, name, discription, oid));
}
@Override
public void addRecToComplite(SQLiteDatabase mDB,int id, String name, String discription, int oid, Cursor cursor) {
    mDB.insert(AppContext.getDbAdapterMain().getDbComp(), null, addRec(id, name, discription, oid));
    cursor.requery();
}

public void GenirateObjective(Cursor cursor,SQLiteDatabase mDB) {
    addRecTJ(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
            cursor.getString(cursor.getColumnIndex("NameObjective")),
            cursor.getString(cursor.getColumnIndex("Discription")),
            cursor.getInt(cursor.getColumnIndex("TactID")));        
    cursor.requery();
}

public Cursor GenObjectiveToComplite(Cursor cursor,SQLiteDatabase mDB, Cursor anotherCursor)
{
   // String tid = getResources().getString(R.string.TactID);
    addRecToComplite(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("NameObjective")),
                    cursor.getString(cursor.getColumnIndex("Discription")),
                    cursor.getInt(cursor.getColumnIndex("TactID")) , cursor );
    anotherCursor.requery();
    return cursor;
}
public void GenObjectiveMain(Cursor cursor,SQLiteDatabase mDB)
{
    // String tid = getResources().getString(R.string.TactID);
    addRecT(mDB,cursor.getInt(cursor.getColumnIndex("_id")),
            cursor.getString(cursor.getColumnIndex("NameObjective")),
            cursor.getString(cursor.getColumnIndex("Discription")),
            cursor.getInt(cursor.getColumnIndex("TactID")));
    cursor.requery();

}

public void genirator(int Res,  Cursor cursor, List<Integer> List, TextView tvObjective) {
    //перемещаем курсор на 1 место в таблице
    cursor.moveToFirst();
    //пробигаемся по счётчику
    for(int i = 0; i<List.size(); i++)
    {
        //Если совпадений нет
        if ( !List.contains(Res))
        {
            List.add(Res);//добавляем номер в счётчик
            cursor.moveToFirst();
            cursor.moveToPosition(Res);//переходим на позицию случайного числа
            //присваиваем значение из БД полям на Активити
           String sID = cursor.getString(cursor.getColumnIndex("TactID"));
           String sName = cursor.getString(cursor.getColumnIndex("NameObjective"));
           String sDiscription = cursor.getString(cursor.getColumnIndex("Discription"));
            //добавляем задание
            GenirateObjective(cursor, AppContext.getDbAdapterMain().getmDB());
           tvObjective.setText(sID +" : "+sName);
        }
    }
}
public void buttonGenirate(Cursor Acursor, List<Integer> ObjectivList, TextView tvObjective)
{
    Random random = new Random();
    int Res = random.nextInt(37);//получаем случайное число
    //ищем было ли уже такое задание
    for(int i = 0; i < ObjectivList.size(); i++ )
    {
        if(ObjectivList.contains(Res))//если да
        {
            Res = random.nextInt(36);// создаём по новой
        }
    }
    //добавляем в список задание
    genirator(Res, Acursor,ObjectivList, tvObjective);
    Collections.sort(ObjectivList);
    for(int i = 0; i<ObjectivList.size(); i++)
    {
        Log.d("tag", "" + ObjectivList.get(i));
    }
}

public void genirator(int Res, Cursor cursor, List<Integer> List) 
{
    //перемещаем курсор на 1 место в таблице
    cursor.moveToFirst();
    //пробигаемся по счётчику
    for(int i = 0; i<List.size(); i++)
    {
        //Если совпадений нет
        if ( !List.contains(Res))
        {
            List.add(Res);//добавляем номер в счётчик
            cursor.moveToFirst();
            cursor.moveToPosition(Res);//переходим на позицию случайного числа
            //присваиваем значение из БД полям на Активити
            GenirateObjective(cursor, AppContext.getDbAdapterMain().getmDB());
            // tvObjective.setText(sID +" : "+sName);
        }
    }
}
//Функция стирания
public void discard(AssigmentFragment assigmentFragment)
{
    delRec(AppContext.getDbAdapterMain().getmDB(),  AppContext.getDbAdapterMain().getDbTable(), AppContext.getDbAdapterMain().getColumnId());
    //стирает  пока есть элементы в счётчике
    for(int i = assigmentFragment.getObjectivList().size(); i >= 0; i--)
    {
        delRec(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbJournal(), AppContext.getDbAdapterMain().getColumnId());
        delRec(AppContext.getDbAdapterMain().getmDB(), AppContext.getDbAdapterMain().getDbComp(), AppContext.getDbAdapterMain().getColumnId());
    }
    //Чистит счётчик
    for(int i = assigmentFragment.getObjectivList().size()-1; i>=0; i--)
    {
        assigmentFragment.getObjectivList().remove(i);
    }
    assigmentFragment.getObjectivList().add(100);
    assigmentFragment.getMainCursor().requery
();
        //Устонавливаем начальные значения
       // assigmentFragment.rec();
        //Показывает начальный диалог
        //createStartDialog();
    }

      }

Ошибка лога

08-10 12:55:39.647 6258-6258/ru.itsmygame.tacticalgenirator E/AndroidRuntime: FATAL EXCEPTION: main
  Process: ru.itsmygame.tacticalgenirator, PID: 6258
  android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
  at ru.itsmygame.tacticalgenirator.controller.DBController.GenirateObjective(DBController.java:75)
  at ru.itsmygame.tacticalgenirator.view.CompliteFragment.onContextItemSelected(CompliteFragment.java:85)
  at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:2332)
  at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:3070)
  at android.support.v4.app.FragmentController.dispatchContextItemSelected(FragmentController.java:366)
  at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:417)
  at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
  at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:4822)
  at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
  at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:172)
  at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1020)
  at android.widget.AdapterView.performItemClick(AdapterView.java:300)
  at android.widget.AbsListView.performItemClick(AbsListView.java:1163)
  at android.widget.AbsListView$PerformClick.run(AbsListView.java:3125)
  at android.widget.AbsListView.onTouchUp(AbsListView.java:3926)
  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3698)
  at android.view.View.dispatchTouchEvent(View.java:8717)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2577)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2300)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2583)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2315)
  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2502)
  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1729)
  at android.app.Dialog.dispatchTouchEvent(Dialog.java:765)
  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2463)
  at android.view.View.dispatchPointerEvent(View.java:8907)
  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4098)
  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3961)
  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3523)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3576)
  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3542)
    at android.view.ViewRootImpl$Asy
Answer 1

Событие onContextItemSelected отдаётся всем фрагментам текущей активити по очереди пока метод не вернёт true (обработано). И так как у Вас в обоих фрагментах используется один и тот же идентификатор CM_RETURN_ID = 1, то условие
if (item.getItemId() == CM_RETURN_ID)
выполняется в первом же по списку фрагменте.
Используйте разные идентификаторы или дополнительно проверяйте id вызвавшего view

READ ALSO
Запуск скрипта при выполнении условий [требует правки]

Запуск скрипта при выполнении условий [требует правки]

Как сделать, чтобы, если в поле на html страничке ввели правильный текст и нажали кнопку, то запускается скрипт? Хелп >~<

338
Ошибка валидатора &#171;The frameborder attribute on the iframe element is obsolete. Use CSS instead&#187;

Ошибка валидатора «The frameborder attribute on the iframe element is obsolete. Use CSS instead»

Есть сайт на wordpress, в котором установлена контактная форма contact form 7 с модулем внутри папки recaptchaphp, где есть такой код:

500
Периодически не отображается favicon

Периодически не отображается favicon

Почему-то на сайте на хостинге иногда не отображается фавиконПрикол в том, что это происходит периодически - раз отображается, в следующий...

411
Точное назначение свойств position и display в css [требует правки]

Точное назначение свойств position и display в css [требует правки]

Может ли кто-нибудь доступно объяснить, как работают свойства position и display точно и понятно? Что именно обозначают relative и absolute, как их комбинировать...

360