根据ID过滤TextViews

时间:2014-02-21 09:52:48

标签: android android-listview textview relativelayout robotium

我正在尝试验证应用的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());
    }
    
  2. 此代码的问题是TextView price = (TextView) hotelDetails.getChildAt(2);没有给我price但是给了我other TextView(不知道为什么)。此外,这仅适用于当前视图。我无法向下滚动整个列表并获取每个产品的详细信息。

    1. 其次,获取当前视图的所有TextView并根据price ID过滤它们。如下所示:

      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);
                  }
      
    2. 我使用这种方法遇到的问题是我不知道如何根据ID过滤这些视图。此外,在滚动时,这会从当前视图中跳过一个或两个产品,但无法解决此问题。

      如果有人可以就此提出建议,那就太棒了。

1 个答案:

答案 0 :(得分:2)

我将参考我之前的一个答案,您可以使用它来查看列表here的索引。

一旦你有了这个,你可以将这个功能与一个新功能结合起来,获得一个视图的所有子元素:

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

然后最后一个是按id

过滤视图列表
public View(List<View> views, int idToMatch) {
    for (View view : views) {
        if (view.getId() == idToMatch) {
            return view;
        }
    }
    return null;
}

你可以找出hwo将这些全部组合成一个能够很好地完成你想要的功能。 (提示一个R.id.price是一个整数,所以只要你有一个孩子在你想得到的索引中,就把它传递给最后一个功能)