2014-01-09 3 views
1

내 프로젝트를 테스트하기 위해 robotium을 사용하고 있습니다. 내 프로젝트에서 사용자 정의 listviews를 사용하고 있습니다. 보기 호출기에있는 페이지에는 최소 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); 

여기도 또한 동일한 issue.First 두 항목 단추 클릭을 얻고 있어요 세 번째 항목에 대한 null 포인터 예외가 발생합니다.

+0

아무도 이것에 대해 생각이 없다 ??? –

+0

목록을 채우기 전에 코드가 실행될 수 있습니까? 스크롤 할 때 뷰를 다시 그려야합니다. 나는 robotium이 listview가 준비되었거나로드되었거나 준비되었는지를 확인하는 방법을 가지고 있다고 확신한다. (단지 발사 일 뿐이었지만, 이미 로봇이 있었을 때 이미 거기에 있었다.) - 메서드를 호출하여 목록 항목을 클릭 할 수도있다. 그 (물론 항목의 이전에 체크 된 수입니다!) – deadfish

+0

그 항목에 목록을 스크롤 한 후에 목록 항목보기를 가져와야합니다. 가능합니까? –

답변

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가 선택한 별의 양을 저장합니다. 그것은 단지 예일뿐입니다. 어댑터에 정보를 저장하고 adfter 스크롤을로드하는 방법을 보여줍니다.

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

목록 행 항목에있는 버튼을 클릭해야합니다. 행의 위치는 런타임에서만 결정됩니다. 해당 항목을 목록으로 스크롤하고 있습니다. 그런 다음 해당 항목의 버튼을 클릭하십시오. 하지만 여기에 내가하려고 할 때 행이 표시되면 코드가 작동합니다로드됩니다. 그러나 행이 표시되지 않고 그 목록 항목으로 스크롤하면 널 포인터 인식을 얻게됩니다. –