2015-10-17 126 views
5

更新:似乎只是在使用應用程序時,在某些隨機時間,當我長時間點擊時,應用程序會崩潰,特別是在屏幕底部的項目。任何想法可能是爲什麼?濃咖啡長按菜單項和彈出菜單

所以在我的應用程序中有一個列表視圖。如果你長按一個列表視圖項目,那麼一個彈出式菜單,錨定到你已經點擊過的那個項目上,出現了刪除或編輯菜單項的選項。只需使用該應用程序,一切正常。您可以長時間點擊列表中的任何項目,底層關聯數據將被刪除,並且列表視圖會在沒有剛刪除的項目的情況下刷新。

我在做什麼: 意式濃縮咖啡不喜歡我的列表視圖和長時間點擊。我只是試圖測試彈出式菜單出現,但我甚至無法讓espresso長時間成功。我在想這個問題與彈出式菜單有關。所以對於初學者來說,我只是想讓濃咖啡變得悠久而不會讓我感到不安。一旦espresso長按成功,我想我可以弄清楚如何檢查彈出窗口是否顯示。

我到目前爲止試過的東西:我看過關閉動畫應該可以幫助意式咖啡減少片狀。我關掉了所有可能的動畫,問題仍然存在。我甚至可以看我的手機上測試運行,並認爲它是longclicking正確的菜單項,但longclick完成,在彈出菜單中應該出現的時候,測試失敗

代碼: 這是咖啡測試線路失敗。除了click()之外,我已經使用了相同的代碼行,應用程序可以做它應該做的事情,而且意式咖啡很開心。 mCourseCount只是列表中最後一項的索引。這不是問題。我在其他幾個測試中更新了相同的索引,並且所有工作都正常。

onData(anything()).inAdapterView(withId(R.id.listview_class))  
     .atPosition(mCourseCount).perform(longClick()); 

一旦有故障,在堆棧跟蹤存在的幾個有趣的線

android.support.test.espresso.PerformException: Error performing 'long 
click' on view ' displaying data matching: ANYTHING within adapter vieW 
matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class' 

,後來

Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used 
without an anchor at 
com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101) 
at android.widget.PopupMenu.show(PopupMenu.java:108)at 
com.cmsc355.classcompass.classcompass.CourseMenuFragment$2. 
onItemLongClick(CourseMenuFragment.java:91) 

堆棧跟蹤的這最後一點是令人困惑,因爲我defintely設置彈出式菜單的錨點如下所示(這是從CourseMenuFragment 91行左右):

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) { 

     PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 
     popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu()); 
     popupEdit.show(); 

     popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 

      if (item.getItemId() == R.id.edit_course) { 

      } else if (item.getItemId() == R.id.delete_course) { 
       throwCourseDeleteAlert(position); 
       listView.setAdapter(mCourseNameAdapter); 
      } 
      return true; 
      } 
     }); 
     return true; 
     } 
    }); 

在彈出窗口第一次實例化的行中,listView.getChildAt(position)定義了彈出菜單的錨點。也許這有問題?但如前所述,只要與自己互動,一切都會按預期完成。

任何指導,將不勝感激。請讓我知道是否需要澄清。

+0

這可能有所幫助:http://stackoverflow.com/questions/24634136/menu-popup-helper-cannot-be-used-without-anchor –

回答

3

找到解決辦法。我正在錯誤地訪問列表項目。取而代之的

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 

我改

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition())); 

我不得不調整的位置,當我在列表中滾動更遠下來的指標。我有點討厭回答我自己的問題,但也許這會幫助別人。