2014-01-09 130 views
1

我正在使用robotium來測試我的項目。我在我的項目中使用自定義列表視圖。在視圖尋呼機中的頁面中將有最少3個列表視圖。我的自定義列表查看名稱是MyDragNDropList。在這個列表視圖中,每行將有1個按鈕。此按鈕是將該項目添加到我的個性化列表。一旦項目被添加,按鈕將被禁用。最初我使用的是在自定義列表視圖中獲取視圖

solo.clickOnText("button text"); or 
    solo.clickOnButton("button text"); or 
    solo.clickOnButton(buttonindex); 

但是現在不工作。所以我嘗試了另一種方法。我將listview設置爲爲單元測試項目創建的listview對象。然後

 solo.scrollListToLine(2, position); 
     solo.waitForDialogToClose(1000); 
     ListView myList=UnitTestHelperClass.getInstance().listView; 
     View listElement = myList.getChildAt(position); 
     View btn=listElement.findViewById(com.safeway.client.android.R.id.list_button); 
     solo.clickOnView(btn); 

如果啓用了第一個可見項目的按鈕,則此代碼將起作用。但是,如果滾動lst,那麼我會在下面一行中得到NullPointerException。

View btn=listElement.findViewById(com.safeway.client.android.R.id.list_button); 

這是爲什麼?我該如何解決這個問題?請幫幫我。

編輯 我試過用另一種方法。而不是從源代碼設置listview,我在測試項目本身中得到了這個。

  solo.scrollListToLine(2, position); 
     ListView list=solo.getCurrentViews(ListView.class).get(2); 
     View listElement=list.getChildAt(position); 
     View btn=listElement.findViewById(com.safeway.client.android.R.id.add_offer_button); 
     solo.clickOnView(btn); 

但這裏我也得到了同樣的問題。前兩項按鈕點擊工作正常。但對於第三項我得到空指針異常。

+0

沒有人有這個想法??? –

+0

是否有可能在列表填充項目之前執行代碼?當你滾動視圖需要重繪。我敢肯定,robotium有一些方法可以檢查listview是準備好還是裝入或準備好(這只是一個鏡頭,但是當我使用robotium之類的東西已經存在時)。 - 您也可以通過調用方法單擊列表項對於(先前檢查項目當然計數!) – deadfish

+0

我需要獲得列表項目視圖後滾動列表item.is它有可能嗎? –

回答

1

我回答:)

public View getViewAtIndex(final ListView listElement, final int indexInList, Instrumentation instrumentation) { 
ListView parent = listElement; 
if (parent != null) { 
    if (indexInList <= parent.getAdapter().getCount()) { 
     scrollListTo(parent, indexInList, instrumentation); 
     int indexToUse = indexInList - parent.getFirstVisiblePosition(); 
     return parent.getChildAt(indexToUse); 
    } 
} 
return null; 
} 


public <T extends AbsListView> void scrollListTo(final T listView, 
    final int index, Instrumentation instrumentation) { 
instrumentation.runOnMainSync(new Runnable() { 
    @Override 
    public void run() { 
     listView.setSelection(index); 
    } 
}); 
instrumentation.waitForIdleSync(); 
} 
0

如果你沒有太多的物品,你想加載最新的配置...這是我的例子whoch節省了選定的星星的數量。這只是一個例子。這只是爲了向您展示如何在適配器中保存一些信息並加載滾動後的頁面。

public class CustomAdapter extends BaseAdapter { 

    private final LayoutInflater inflater; 
    private final String[] elements; 
    private final int[] stars; 
    private CustomClickListener listener; 

    public CustomAdapter(Activity activity) { 
     this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.elements = activity.getResources().getStringArray(R.array.questions); 

     stars = new int[elements.length]; 
     resetStars(stars); 

     listener = new CustomClickListener(stars, activity); 

    } 

    private void resetStars(int[] stars) { 
     for(int i=0;i<stars.length;i++) 
      stars[i] = 1; 
    } 

    @Override 
    public int getCount() { 
     return elements.length; 
    } 

    @Override 
    public String getItem(int i) { 
     return elements[i]; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup viewGroup) { 

     view = inflater.inflate(R.layout.item, null); 

     TextView text = (TextView) view.findViewById(R.id.question); 
     ColoredRatingBar ratingBar = (ColoredRatingBar) view.findViewById(R.id.ratingbar); 

     try { 
      Log.d("xxx", "setting stars for " + position); 
      ratingBar.setRating(stars[position]); 
     } catch (Exception e) { 
      Log.d("xxx", "exception ignored"); 
     } 

     ratingBar.setOnRatingBarChangeListener(new ColoredRatingBar.OnRatingBarChangeListener() { 
      @Override 
      public void onRatingChanged(ColoredRatingBar ratingBar, float rating, boolean fromUser) { 
       stars[position] = (int) rating; 
      } 
     }); 

     View submit = view.findViewById(R.id.item_submit); 
     Button submitButton = (Button) view.findViewById(R.id.submitButton); 

     text.setText(getItem(position)); 

     if (position == (getCount() - 1)) { 
      submit.setVisibility(View.VISIBLE); 

      submitButton.setOnClickListener(listener); 
     } 

     return view; 

    } 



} 

對不起,我已經沒有實現ViewHolder類:(

+0

嗨,死魚,我需要在我的測試項目中得到listview實例。 –

+0

對不起,你的意思是? – deadfish

+0

我需要點擊列表行項中的按鈕。行的位置僅在運行時決定。我正在將列表滾動到該項目。然後嘗試點擊該項目中的按鈕。但在這裏,當我試圖做到這一點,行是可見的,當列表加載代碼將工作。但是,如果行不可見,我們滾動到該列表項,那麼我會得到一個空指針的影響。 –