Фильтр TextViews на основе идентификатора

Я пытаюсь проверить TextView приложения, которое показывает price перечисленных продуктов при поиске по категории.

Я использую Robotium для автоматизации.

Иерархия, когда я получаю текущее представление (solo.getCurrentViews(ListView.class)), выглядит примерно так:

ListView
--> (0)FrameLayout
--> (1)RelativeLayout
         --> (0)ImageView
         --> (1)RelativeLayout
                -->(0)ImageView
                -->(1)TextView    //id - name
                -->(2)TextView    //id - price
                -->(3)TextView    //id - other
--> (2)RelativeLayout
         --> (0)ImageView
         --> (1)RelativeLayout
                -->(0)ImageView
                -->(1)TextView    //id - name
                -->(2)TextView    //id - price
                -->(3)TextView    //id - other

--> (3)RelativeLayout
         --> (0)ImageView
         --> (1)RelativeLayout
                -->(0)ImageView
                -->(1)TextView    //id - name
                -->(2)TextView    //id - price
                -->(3)TextView    //id - other

--> (4)RelativeLayout
         --> (0)ImageView
         --> (1)RelativeLayout
                -->(0)ImageView
                -->(1)TextView    //id - name
                -->(2)TextView    //id - price
                -->(3)TextView    //id - other

--> (5)RelativeLayout
         --> (0)ImageView
         --> (1)RelativeLayout
                -->(0)ImageView
                -->(1)TextView    //id - name
                -->(2)TextView    //id - price
                -->(3)TextView    //id - other

Я мог придумать два способа узнать цену:

  1. Пройдите через дочерние элементы списка и перейдите к цене через индекс. Как ниже код

    int index = 1;
    ListView view = null;
    
    List<ListView> productList = solo.getCurrentViews(ListView.class);
    view = productList.get(0);
    for (int i = 1; i < view.getChildCount(); i++) {
        RelativeLayout relativeLayoutDetails = (RelativeLayout) view.getChildAt(index++);  // get the first RelativeLayout
    
        RelativeLayout productDetails = (RelativeLayout) relativeLayoutDetails.getChildAt(2); //get the inner child RelativeLayout
        TextView productName = (TextView) productDetails.getChildAt(0);
        System.out.println("********" + productDetails.getChildCount());
        TextView price = (TextView) productDetails.getChildAt(2);
        System.out.println(productName.getText().toString() + "---"+ price.getText().toString());
    }
    

Проблема с этим кодом в том, что TextView price = (TextView) hotelDetails.getChildAt(2); не дает мне price, но дает мне other TextView (не знаю почему). Также это работает только для текущих представлений. Я не могу прокрутить полный список и получить подробную информацию по каждому продукту.

  1. Во-вторых, получить все TextView для текущих просмотров и отфильтровать их на основе идентификатора price. Что-то вроде ниже:

    ListView l = (ListView) solo.getView (android.R.id.list); int viewShown = l.getChildCount ();

            int total = l.getCount();
    
            int i;
            int index=1;
            if (hotelsShown != 0) {
                for (i = 0; i < total / viewShown; i++) {
    
    
                        List<TextView> textViews = solo.getCurrentViews(TextView.class, l);  //get all the text views
                        //filter for price
                        for(TextView priceView: textViews){
                           if(priceView.id equals "price-id")
                                    //get this TextView.
                        }
    
                    solo.scrollDown();
                    solo.sleep(500);
                }
    

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

Если бы кто-то мог что-то предложить по этому поводу, это было бы здорово.


person roger_that    schedule 21.02.2014    source источник
comment
почему бы не установить OnItemClickListener для каждого ListView?   -  person Houcine    schedule 21.02.2014
comment
как это поможет? Я получу новую иерархию, как только я нажму на элемент списка, я думаю. Извините, я новичок в автоматизации Android.   -  person roger_that    schedule 21.02.2014
comment
добавьте код, в котором вы создаете экземпляры своих адаптеров, и установите их в свои списки   -  person Houcine    schedule 21.02.2014


Ответы (1)


Я буду ссылаться на один из моих предыдущих ответов, который вы можете использовать, чтобы получить представление по индексу списка здесь.

Получив это, вы можете объединить функцию с новой, которая получит все дочерние элементы представления:

private List<View> getAllChildren(View v) {

    if (!(v instanceof ViewGroup)) {
        ArrayList<View> viewArrayList = new ArrayList<View>();
        viewArrayList.add(v);
        return viewArrayList;
    }

    ArrayList<View> result = new ArrayList<View>();

    ViewGroup viewGroup = (ViewGroup) v;
    for (int i = 0; i < viewGroup.getChildCount(); i++) {

        View child = viewGroup.getChildAt(i);

        ArrayList<View> viewArrayList = new ArrayList<View>();
        viewArrayList.add(v);
        viewArrayList.addAll(getAllChildren(child));

        result.addAll(viewArrayList);
    }
    return result;
}

и, наконец, последний - отфильтровать список представлений по идентификатору

public View(List<View> views, int idToMatch) {
    for (View view : views) {
        if (view.getId() == idToMatch) {
            return view;
        }
    }
    return null;
}

Вы, вероятно, сможете придумать, как объединить все это в одну функцию, которая будет хорошо делать то, что вы хотите. (Подсказка, что R.id.price является целым числом, поэтому просто передайте это в последнюю функцию, как только у вас будет список детей по индексу, который вы хотели получить)

person Paul Harris    schedule 21.02.2014