listview中单击RadioButton,并未触发listview的单击事件,怎样才能解决这个问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了listview中单击RadioButton,并未触发listview的单击事件,怎样才能解决这个问题?相关的知识,希望对你有一定的参考价值。

你设置了RadioButton,RadioButton截获了点击事件,你可以设置RadioButton 不可获取焦点即可。 参考技术A 这个还得通过消息去监听他的状态,然后在去做改变,你是要点击listview或者点击radioButton时都响应这个事件吧? 参考技术B 建议看下触屏分发过程,一般Button会阻塞父View点击事件的 参考技术C 楼上二位的好像都不是太准确。自己从消息机制入手吧。

如何单击 ListView 特定行位置中的视图

【中文标题】如何单击 ListView 特定行位置中的视图【英文标题】:How can I click on a View in ListView specific row position 【发布时间】:2015-09-28 12:53:08 【问题描述】:

我有一个 ListView:

我想点击 ListView 中的特定按钮。

如果我想使用 onData 选择器进行选择:

onData(withId(R.id.button))
                .inAdapterView(withId(R.id.list_view))
                .atPosition(1)
                .perform(click());

我得到这个错误:

android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id: com.example.application:id/list_view'.
...

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

onData() 需要一个对象匹配器来匹配您感兴趣的项目。如果您不关心适配器中的数据,您可以使用Matchers.anything() 来有效匹配适配器中的所有对象。或者,您可以为您的项目创建一个数据匹配器(取决于存储在适配器中的数据)并将其传递给更具确定性的测试。

至于按钮 - 您正在寻找的是一个 onChildsView() 方法,它允许为列表项的后代传递一个视图匹配器,在 onData().atPosition() 中匹配

因此,您的测试将如下所示:

    onData(anything()).inAdapterView(withId(R.id.list_view))
            .atPosition(1)
            .onChildView(withId(R.id.button))
            .perform(click());

【讨论】:

谢谢!我之前没有在 onChildsView 上看到这个。顺便说一句,nthChildDescendant 函数可能对其他东西有用:)【参考方案2】:

我使用了一种不使用 ListView 数据和.getPosition(index) 的解决方法,而是检查具有特定 id 的视图是否是 ListView 特定位置视图的后代。

public static Matcher<View> nthChildsDescendant(final Matcher<View> parentMatcher, final int childPosition) 
    return new TypeSafeMatcher<View>() 
        @Override
        public void describeTo(Description description) 
            description.appendText("with " + childPosition + " child view of type parentMatcher");
        

        @Override
        public boolean matchesSafely(View view) 

            while(view.getParent() != null) 
                if(parentMatcher.matches(view.getParent())) 
                    return view.equals(((ViewGroup) view.getParent()).getChildAt(childPosition));
                
                view = (View) view.getParent();
            

            return false;
        
    ;

使用示例:

onView(allOf(
       withId(R.id.button), 
       nthChildsDescendant(withId(R.id.list_view), 1)))
   .perform(click());

【讨论】:

以上是关于listview中单击RadioButton,并未触发listview的单击事件,怎样才能解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

android 开发 listview绑定radiobutton控件 如何实现listview列表中只有一个radiobutton被选中?

ListView 中的 RadioButton 波纹效果

带有 RadioButton 单选的自定义 ListView

asp.net(C#)怎样将listview中的radiobutton设置成互斥?

ListView中的RadioButton怎么单选?

WPF c# 界面上有3个radiobutton和3个listview 选择不同的radiobutton出现不同的listview