Android webview导致点击侦听器无法触发

时间:2012-12-03 19:07:56

标签: android android-webview listener

我有一个包含文章列表的ListView。每篇X篇文章(目前有10篇),我都有一个显示广告的WebView。我可以点击任何列表项除了显示WebView的那个列表项之外的列表项。那个人不会注册我的点击。

显示或隐藏WebView的代码:

if(position % 10 == 0) // || position == 0) && position > 0
{
    viewHolder.adView.loadUrl(tmpAdURL);
    viewHolder.adView.setVisibility(View.VISIBLE);
}
else
{
    viewHolder.adView.setVisibility(View.GONE);
    viewHolder.adView.invalidate();
}

main.xml中

<ListView android:id="@+id/articles_list"
    style="@style/ListView"
    android:fadingEdge="vertical"
    android:fadingEdgeLength="16dp"
    android:divider="@color/extreme_light_gray"
    android:dividerHeight="1dp" />

MainActivty.java的onCreate()中的监听器:

articleEntryListView.setOnItemClickListener(new OnItemClickListener()
{
    public void onItemClick(AdapterView<?> parent, View v, int position, long id)
    {
        Log.d("MINE", "ARTICLE CLICKED");
    }
}

article_entry_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minHeight="60dp" >

    <!-- Title of the news entry -->

    <ImageView
        android:id="@+id/article_thumbnail"
        android:layout_width="90dp"
        android:layout_height="80dp"
        android:layout_alignParentRight="true"
        android:adjustViewBounds="true"
        android:contentDescription="@string/articleThumbnail"
        android:cropToPadding="true"
        android:paddingRight="10dp"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:paddingLeft="0.5dp"
        android:scaleType="centerCrop" />
        <!-- WAS: android:padding="0.5dp" -->



    <LinearLayout
        android:id="@+id/article_row"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_marginRight="5dp"
        android:layout_toLeftOf="@id/article_thumbnail"
        android:minHeight="80dp"
        android:orientation="vertical"
        android:padding="10dp" >

        <TextView
            android:id="@+id/article_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/articleTitle"
            android:textColor="@drawable/list_title_selector"
            android:textSize="14sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/article_subtitle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/articleSubtitle"
            android:textColor="@drawable/list_subtitle_selector"
            android:textSize="10sp" />
    </LinearLayout>

    <WebView
        android:id="@+id/article_ad"
        android:layout_width="match_parent"
        android:layout_height="90dp"
        android:background="@color/meddark_gray"
        android:layout_below="@+id/article_thumbnail"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:padding="10dp" />

</RelativeLayout>

2 个答案:

答案 0 :(得分:2)

您正在使用一行布局浪费资源。想一想:你在所有行中创建一个WebView,但是你会立即将它们隐藏起来(超过90%)......相反,你应该通过覆盖这些方法来使用具有两个行布局的自定义适配器:

@Override
public int getItemViewType(int position) {
    return position % 11 == 0 ? 1 :  0;
}

@Override
public int getViewTypeCount() {
    return 2;
}

接下来在getView()newView()内检查您应加载哪种类型的布局。当getItemViewType()返回0时膨胀新闻项布局,并在返回1时使WebView(自身)膨胀。

除了更快,更有条理之外,您的WebView现在拥有自己的行,并且应该很好。

答案 1 :(得分:0)

这可能类似于我在列表项中使用CheckBox时遇到的问题。尝试在列表项XML中使用android:focusable="false" WebView选项。

在我的情况下,CheckBox从列表项中获得了焦点,并且由于某种原因阻止了事件的发生。

http://developer.android.com/reference/android/view/View.html#attr_android:focusable

<WebView
    android:id="@+id/article_ad"
    android:layout_width="match_parent"
    android:layout_height="90dp"
    android:background="@color/meddark_gray"
    android:layout_below="@+id/article_thumbnail"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"
    android:padding="10dp"
    android:focusable="false" />

您还可以使用

在后面的代码中执行此操作
setFocusable(false);