使用Horizo​​ntalScrollView单击未捕获ListView项目的事件

时间:2014-12-31 10:59:08

标签: android listview horizontalscrollview

我有一个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正在使包含listview的布局膨胀,该列表视图包含上述元素。

我需要能够捕获每个项目的点击事件,以便在单击项目时更改元素的颜色,并在单击其他项目时将其恢复为原始颜色,因为新项目会更改元素颜色,依此类推

这意味着我尝试在OnItemClickListener内抓取Fragment1.java

    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事件都在捕捉点击/触摸...事件,我没有得到任何回复。正如您所看到的,我尝试了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

2 个答案:

答案 0 :(得分:4)

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

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

  • 首先:

    机器人:descendantFocusability = “blocksDescendants”

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

  • 第二

    机器人:可点击= “假” 机器人:可聚焦=“假” 机器人:focusableInTouchMode = “假”

这三个属性需要出现在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);
    }

    //...
}

需要考虑的是这个解决方案对我有用,因为“首次点击然后滑动”的行为就是我想要的,所以请注意这可能不是你想要的,但应该帮助你完成你的任务。那工作。

答案 1 :(得分:0)

尝试更改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>

希望这可以帮助你