【问题标题】:Click event not being captured for ListView items with HorizontalScrollView没有为具有 Horizo​​ntalScrollView 的 ListView 项目捕获单击事件
【发布时间】:2014-12-31 10:59:07
【问题描述】:

我有一个ListView,每行有多个元素,如下所示:

list_element.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:id="@+id/global_container"
                    android:descendantFocusability="blocksDescendants"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">


        <HorizontalScrollView
            android:id="@+id/scrollview"
            android:clickable="true"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none">

Fragment1.java 正在膨胀包含具有上述元素的列表视图的布局。

我需要能够捕获每个项目的单击事件,以在单击该项目时更改元素的颜色,并在单击另一个项目时将其恢复为原始颜色,因为新项目更改了元素颜色等等.

这意味着我试图在Fragment1.java 内部捕获OnItemClickListener

    if (rootView != null) {
        myList = (ListView) rootView.findViewById(R.id.my_list);
    }

    ArrayList l = new ArrayList();

//Bogus list
    for (int i=0; i<20; i++) {
        l.add(new Object());
    }

    adapter = new MyListAdapter(l, getActivity());

    myList.setAdapter(adapter);


    final MyListAdapter ad = adapter;

    myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
            ad.setClickedPosition(position);
    ad.notifyDataSetChanged();
        }
    });

但是(我假设)HorizontalScrollView 的所有 Touch 事件都在捕获 click/touch... 事件,但我没有得到任何响应。如您所见,我尝试了android:descendantFocusability="blocksDescendants" 并来回更改焦点,但没有任何结果。

我还尝试在列表适配器中捕获不同的事件:

vi = inflater.inflate(R.layout.list_element, null, true);

vi.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View view) {

        Log.d("aaa", "aaa");


    }
});

和/或

horizontalScroll = vi.findViewById(R.id.scrollview);

horizontalScroll.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View view) {

        Log.d("aaa", "aaa");


    }
});

这两个选项都没有任何结果。然后我应该如何捕获列表中某个项目的点击事件并保持能够使用HorizontalScrollView

【问题讨论】:

    标签: android listview horizontalscrollview


    【解决方案1】:

    好的,我解决了如下问题:

    为了能够点击列表项,需要完成这两件事。

    • 第一:

      android:descendantFocusability="blocksDescendants"

    需要出现在行元素布局的最顶部元素上。

    • 第二:

      android:clickable="假" 安卓:可聚焦=“假” android:focusableInTouchMode="false"

    这 3 个属性需要出现在 Horizo​​ntalScrollView 上。

    该解决方案的问题在于 Horizo​​ntalScrollView 本身无法工作,因此您需要在检测到点击事件后激活它。我是在适配器的 getView() 方法上做的。

    当点击元素时,我将位置传递给适配器:

    fragment.java

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
    
            //Private method inside the adapter
            ad.setClickedPosition(position);
            ad.notifyDataSetChanged();
    
        }
    });
    

    adapter.java

    public void setClickedPosition(int clickedPosition) {
        this.clickedPosition = clickedPosition;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        if (clickedPosition == position)
            holder.scrollview.setScrollingEnabled(true);
        else
            holder.scrollview.setScrollingEnabled(false);  
     }
    

    CustomHorizo​​ntalScrollview.java

        public void setScrollingEnabled (boolean enabled) {
            this.isScrollEnabled = enabled;
        }
    
    //...
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
    
        //...
    
        if (isScrollEnabled) {
            return super.onTouchEvent(ev);
        }
    
        //...
    }
    

    需要考虑的是这个解决方案对我有用,因为“先点击然后滑动”的行为是我正在寻找的,所以请注意这可能不是你想要的,但应该可以帮助你实现那个工作。

    【讨论】:

    • 感谢您的回答!对于我来说,在父母中设置 android:descendantFocusability="blocksDescendants" 已经足够了。
    【解决方案2】:

    尝试如下更改您的 list_element.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:id="@+id/global_container"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
    
        <HorizontalScrollView
            android:id="@+id/scrollview"            
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none" />
    </RelativeLayout>
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复,但是没有用,原来是这样的。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多