3

我设计了一个带有自定义项目布局的 GridView,左上角有一个 ImageView,右上角有另一个 ImageView,中间有一个主 ImageView 和 Text。

我需要为角落的两个 ImageView 和适配器的 OnItemClickListener 设置 OnClickListener。

一切正常,但只有 GridView 中的第一项无法触发 OnClickListener。任何人都可以解决这个问题吗?

PS我发现ImageView的第一项OnClickListener会在我做下一个动作时触发(例如点击其他项目)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    TagView tag;
    if (convertView == null) {
        v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
        tag = new TagView(
                (ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
                (TextView) v.findViewById(R.id.myDoc_GridItem_TV),
                (ImageView) v.findViewById(R.id.iViewAdd2Category),
                (ImageView) v.findViewById(R.id.iViewDelete));
        v.setTag(tag);
    } else {
        tag = (TagView) v.getTag();
    }

    v.setLayoutParams(new GridView.LayoutParams((int) (180 * v
            .getResources().getDisplayMetrics().density), (int) (180 * v
            .getResources().getDisplayMetrics().density)));


    tag.image.setScaleType(ImageView.ScaleType.CENTER_CROP);
    tag.image.setImageDrawable(new BitmapDrawable(BitmapFactory.decodeFile(m_DisplayItems.get(position)
                    .get("image").toString())));
    tag.text.setText(m_DisplayItems.get(position).get("text").toString());
    tag.iAdd2Category.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
    tag.iDelete.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
    if (m_IsEdit) {
        tag.iAdd2Category.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Click on image add 2 category");
            }
        });

        tag.iDelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Click on image delete");
            }
        });
    }

    return v;
}
4

4 回答 4

1

我终于在这篇文章中找到了答案。

OnClickListener 不适用于 GridView 中的第一项

就我而言:

if (convertView == null) {
    v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
    tag = new TagView(
            (ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
            (TextView) v.findViewById(R.id.myDoc_GridItem_TV),
            (ImageView) v.findViewById(R.id.iViewAdd2Category),
            (ImageView) v.findViewById(R.id.iViewDelete));
    v.setTag(tag);
} else {
    tag = (TagView) v.getTag();
}

只需删除 if else 语句,每次都会实例化“标签”。

于 2013-01-14T01:34:51.730 回答
1

混合OnClickListenersOnItemClickListeners用于列表的项目效果不佳。

在您的情况下,您可能应该OnClickListeners在项目的不同部分使用多个,并且根本不使用OnItemClickListener

于 2013-01-07T10:18:17.070 回答
1

出现这个问题的原因是,Android 不仅在绘制 View 时为第一项调用 getView(),而且还为 Layout-Measuring!在 getView() 中,度量调用和绘图调用没有任何区别。因此,当您第一次进行绘图调用时,以及稍后的某个度量调用时,您会覆盖 onClickListener。实际上这样做似乎是正确的——因为你每次都这样做,但我观察到了这种行为。也许您设置了 clickListener 并且系统在 getView 调用后将其释放,因为不会绘制视图......我没有跟踪到足够深来保证。

尽管如此,每次都重新创建视图是一个坏主意,因为它非常耗时 - 您的网格可能无法平滑滚动。

解决方案是编写自己的 GridView,如下所示:

public class MyGridView extends GridView{
private GridAdapter adapter;


public MyGridView(Context context) {
    super(context);
}

public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public MyGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setAdapter(GridAdapter adapter) {
    this.adapter = adapter;
    super.setAdapter(adapter);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(adapter!=null)
        adapter.setIsMeasureCall();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}}

并在您的 GridAdapter 中实现方法 setIsMeasureCall()。该方法仅在调用时将标志设置为 true。然后在你的 getView() 方法中检查它是否是一个度量调用,如果这是真的 - 你不设置监听器。

确保在 getView() 方法结束时将 isMeasure 设置为 false。

我希望一切都清楚:)

有关更多信息,您可以查看我的主页,我提供了一个完整的 Android 项目来解决这个问题。 http://simon.osim.at/projects/gridadapter/#TheSolution

于 2015-09-24T10:34:17.957 回答
0

选择器文件

    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true" android:drawable="@drawable/gridview_item_shape"></item>
     <item android:state_pressed="false" android:drawable="@android:color/transparent"></item>
</selector>

项目布局文件

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

    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/griditem"
        android:padding="2dp"
        android:src="@drawable/grid_photo"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/gridview_item_select"
         />
</RelativeLayout>
于 2013-03-08T06:42:34.077 回答