2014-01-09 6 views
1

Я использую robotium для проверки моего проекта. Я использую пользовательские списки в моем проекте. На странице, которая находится в представлении пейджера, будет минимум 3 списка. Мое пользовательское имя списка: MyDragNDropList. В этом списке будет 1 кнопка в каждой строке. Эта кнопка предназначена для добавления этого элемента в мой персонализированный список. После добавления элемента кнопка будет отключена. Первоначально я использовалполучить представление в пользовательском listview

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); 

Почему это так? Как я могу решить эту проблему? Пожалуйста, помогите мне.

EDIT Я пробовал по другому методу. Вместо установки 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 два элемента нажмите работает fine.but для третьего пункта я получаю исключения нулевого указателя.

+0

Никто не имеет представление об этом ??? –

+0

Возможно ли, что код выполняется до того, как список заполнит элементы? Когда вы просматриваете представление, нужно перерисовать. Я уверен, что у robotium есть что-то для проверки готовности или загрузки списка (это просто выстрел, но когда я был использован robotium soemthing вроде этого уже был там). Вы также можете щелкнуть элемент списка, вызвав метод для этого (предварительно проверенное количество элементов, конечно!) – 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

Если у вас нет слишком большого количества предметов, и вы хотите загрузить последнюю конфигурацию ... вот мой пример, который ухаживает за количеством выбранной звезды. Это просто пример. Это просто, чтобы показать вам, как сохранить некоторую информацию в адаптере и загрузить дополнительную прокрутку.

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

hi deadfish, мне нужно получить экземпляр listview в моем тестовом проекте. –

+0

извините, что вы имеете в виду? – deadfish

+0

Мне нужно нажать на кнопку, которая есть в элементе списка. Позиция строки определяется только во время выполнения. Я прокручиваю список до этого элемента. Затем попробуйте нажать на кнопку в этом элементе. Но здесь, когда я пытался это сделать, строка видна, когда список загружает код, будет работать. Но если строка не видна, и мы переходим к этому элементу списка, тогда я получу нулевое обнаружение указателя. –

Смежные вопросы