GridView中第一项的imageView onClick事件无法工作或延迟

时间:2013-01-07 10:06:22

标签: android gridview click imageview

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

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

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

P.S。我发现第一项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 个答案:

答案 0 :(得分:1)

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

在您的情况下,您可能应该在商品的不同部分使用多个OnClickListeners,而根本不使用OnItemClickListener

答案 1 :(得分:1)

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

OnClickListener not working for first item in 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语句,每次都会实例化“tag”。

答案 2 :(得分:1)

这个问题的原因是,Android不仅在绘制视图时调用第一个项目的getView(),而且还用于布局测量!测量调用和绘制调用之间的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

答案 3 :(得分: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>