【问题标题】:Implement infinite scrolling in Androidviewclient在Androidviewclient中实现无限滚动
【发布时间】:2015-01-21 01:37:11
【问题描述】:

我正在尝试为已实现列表项滚动的应用程序实现 Androidviewclient 5.1.1。我想滚动到列表中的所有条目都已完成。 可滚动的变为 FALSE。

我应该如何继续执行此操作?
我应该检查哪个属性或 ANDROIDVIEWCLIENT?

【问题讨论】:

    标签: android python androidviewclient


    【解决方案1】:

    在设备上运行通讯录应用程序时,我使用culebra GUI(来自AndroidViewClient 9.2.1)生成此脚本scrollable.py

    culebra -pVCLGo scrollable.py
    

    为了滚动列表,我使用了culebra: the magical drag 中描述的拖动对话框。

    退出 GUI 并生成脚本后,我删除了除 ListView 之外的所有其他视图,并添加了 while 循环。因此,除了while 循环之外,几乎所有内容都是自动生成的。

    现在的最终脚本是:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    '''
    Copyright (C) 2013-2014  Diego Torres Milano
    Created on 2015-01-21 by Culebra v9.2.1
                          __    __    __    __
                         /  \  /  \  /  \  /  \ 
    ____________________/  __\/  __\/  __\/  __\_____________________________
    ___________________/  /__/  /__/  /__/  /________________________________
                       | / \   / \   / \   / \   \___
                       |/   \_/   \_/   \_/   \    o \ 
                                               \_____/--<
    @author: Diego Torres Milano
    @author: Jennifer E. Swofford (ascii art snake)
    '''
    
    
    import re
    import sys
    import os
    
    
    try:
        sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
    except:
        pass
    
    from com.dtmilano.android.viewclient import ViewClient
    
    TAG = 'CULEBRA'
    
    _s = 5
    _v = '--verbose' in sys.argv
    
    
    kwargs1 = {'ignoreversioncheck': False, 'verbose': True, 'ignoresecuredevice': False}
    device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
    kwargs2 = {'startviewserver': True, 'forceviewserveruse': False, 'autodump': False, 'ignoreuiautomatorkilled': True}
    vc = ViewClient(device, serialno, **kwargs2)
    
    device.Log.d(TAG, "dumping content of window=-1",  _v)
    vc.dump(window=-1)
    
    def doSomething(view):
        if view.getClass() == 'android.widget.TextView':
            print view.getText()
    
    while True:
        device.Log.d(TAG, "finding view with id=android:id/list",  _v)
        android___id_list = vc.findViewByIdOrRaise("android:id/list")
        # check if scrollable
        if not android___id_list.isScrollable():
            break
        vc.traverse(root=android___id_list, transform=doSomething)
        device.Log.d(TAG, "Scrolling",  _v)
        device.dragDip((185.0, 499.0), (191.0, 175.5), 200, 20, 0)
        vc.sleep(1)
        device.Log.d(TAG, "dumping content of window=-1",  _v)
        vc.dump(window=-1)
    

    注意:在这种情况下,脚本永远不会退出,因为联系人中的 ListView 永远不会更改其可滚动属性,我希望您的应用 正如你在问题中提到的那样。

    编辑 1

    根据其中一个 cmets 的请求为 ListView 子项添加了树遍历

    编辑 2

    添加了 doSomething() 转换方法

    编辑 3

    现在检查类

    【讨论】:

    • 但是你是怎么得到列表视图中每一项的值的呢?
    • vc.dump(window=-1) 之后,您将拥有可见的项目。所以你可以使用vc.findView*()。此外,vc.dump() 的返回值是 View 的列表,因此您也可以对其进行迭代。
    • 但是我的第一个问题是:你检测到结尾了吗(scrollable == False)?
    • 我正在尝试检测但似乎没有找到。告诉我一件事,列表中有多个文本视图,但它们都具有相同的 id ,例如。有 10 个联系人,每个人都有相同的 id,那么如何遍历它们直到我获取所有值?
    • 遍历ListView的所有子节点
    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多