3

我有一个包含文章列表的 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();
}

主要的.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>
4

2 回答 2

2

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

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

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

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

除了更快和更有条理之外,您的 WebView 现在有自己的行,应该可以玩得很好。

于 2012-12-03T19:23:14.743 回答
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);
于 2012-12-03T19:13:04.003 回答