当列表项包含ViewPager时,ListView不接受onClickListener

时间:2014-12-08 18:41:45

标签: android listview android-listview android-viewpager

我有一个列表视图,在其中我有一个视图寻呼机,你可以在下面的代码中看到。 虽然viewPager在项目视图中,但List不接受onItemClickListener,当我单击Items时没有任何反应。

我找到的一个解决方案是将onClickListener添加到ViewPager页面,但我认为这不是一个好的解决方案,因为如果列表包含100个项目,并且每个项目都有一个包含5个页面的视图寻呼机,那么我应该定义500个侦听器而不是一个倾听者。

我尝试了所有搜索过的解决方案,例如更改了根视图的可聚焦或可点击属性。

请与我分享您的建议。

这是列表项布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/propertylist_item_root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/purple"
    android:paddingBottom="1dp"
    android:descendantFocusability="blocksDescendants" >

    <!-- background slider -->
    <android.support.v4.view.ViewPager
        android:id="@+id/property_images_view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- favorite icon -->
    <ImageButton
        android:id="@+id/favorite_button"
        android:contentDescription="@string/favorite_button_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent"
        android:layout_margin="10dp"
        android:src="@drawable/ic_favorite" />
        ...

    <!-- Some other tags -->

这是列表适配器代码:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = convertView;
    if (view == null)
    {
        LayoutInflater inflater;
        inflater = LayoutInflater.from(getContext());
        view = inflater.inflate(R.layout.property_listing_item, parent, false);
    }

    RPropertyStorage property = getItem(position);

    if (property != null)
    {
        PropertyListingImagesAdapter adapter = new PropertyListingImagesAdapter(property.getImages());
        ViewPager imagesPager = (ViewPager) view.findViewById(R.id.property_images_view_pager);
        imagesPager.requestDisallowInterceptTouchEvent(false);
        imagesPager.setAdapter(adapter);
    }
    return view;
}

ListView的OnItemClickListener:

list.setOnItemClickListener(new OnItemClickListener()
{

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3)
    {
        RToast.getInstance().showMessage("Clicked");

        RLog.info("Clicked");
    }

});

1 个答案:

答案 0 :(得分:0)

ViewPager具有非常“强大”的代码来处理触摸事件。对我来说,这只是通过它自己的clicklisteners捕获viewpager点击的一种方式。

不关心

  

如果您列出包含100个项目,并且每个项目都有一个包含5个页面的视图寻呼机,那么我应该定义500个Listener而不是一个Listener。

因为listview只创建了同时可以在屏幕上显示的视图+ 2;您可以通过适配器中的此类代码进行检查

int count=0;

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = convertView;
    if (view == null)
    {
        LayoutInflater inflater;
        inflater = LayoutInflater.from(getContext());
        view = inflater.inflate(R.layout.property_listing_item, parent, false);
        Log.v("","creating "+count);
        count++;

    }

    //your code
}

监听器只是链接。无论你在某种方法上有多少链接。只需检查它是否为空。