Android GridView自定义BaseAdapter ImageView ImageButton OnItemClick不起作用

问题描述

|| 我在使用带有CustomAdapter的GridView时遇到问题(扩展了BaseAdapter)。 我的活动实现了OnItemClickListener。 如果我将ImageView用作项目,则一切正常,OnItemClick-Events将被触发/捕获 我尚未找到使用ImageButton的带有自定义BaseAdapter的GridView的有用示例。 有人知道吗? 片段:
class MyActivity extends Activity implements OnItemClickListener {
  ...
  @Override
  public void onCreate() {
    ...
    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setonItemClickListener(this);
    gridview.setAdapter(new ImageButtonAdapter(this));
  }
  ...    
  @Override
  public void onItemClick(AdapterView<?> adapter,View view,int arg2,long arg3)
  {
    Log.e(\"onItemClick()\",\"arg2=\" + arg2 + \",arg3=\" + arg3);
  }
}


public class ImageButtonAdapter extends BaseAdapter
{
  private Context    mContext;

  public LayoutMenuAdapter(Context c)
  {
    mContext = c;
  }

  public int getCount()
  {
    return mThumbIds.length;
  }

  public Object getItem(int position)
  {
    return null;
  }

  public long getItemId(int position)
  {
    return 0;
  }

  public View getView(int position,View convertView,ViewGroup parent)
  {

    /* IF I USE THIS PART EVERYTHING WORKS FINE */

    // ImageView imageView;
    // if (convertView == null) {
    //    imageView = new ImageView(mContext);
    //    imageView.setLayoutParams(new GridView.LayoutParams(100,100));
    //    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    //    imageView.setPadding(0,0);
    //    imageView.setFocusable(false);
    //  } else {
    //    imageView = (ImageView) convertView;
    //  }
    //  imageView.setimageResource(mThumbIds[position]);
    //  return imageView;

    /* IF I USE THIS PART NO THE ACTIVITY/LISTENER RECEIVES NO EVENT */

    ImageButton imageButton;
    if (convertView == null) {
      imageButton = new ImageButton(mContext);
      imageButton.setLayoutParams(new GridView.LayoutParams(100,100));
      imageButton.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageButton.setPadding(0,0);
      imageButton.setFocusable(false);
    } else {
      imageButton = (ImageButton) convertView;
    }
    imageButton.setimageResource(mThumbIds[position]);
    return imageButton;
  }

  // references to images
  private Integer[] mThumbIds = { R.drawable.media};
}
    

解决方法

在getView()中实现OnClickListener。
Class MyActivity extends Activity implements OnItemClickListener {
      ...
      @Override
      public void onCreate() {
        ...
        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setOnItemClickListener(this);
        gridview.setAdapter(new ImageButtonAdapter(this));
      }
      ...    
     // @Override
     // public void onItemClick(AdapterView<?> adapter,View view,int arg2,long arg3)
     // {
      //  Log.e(\"onItemClick()\",\"arg2=\" + arg2 + \",arg3=\" + arg3);
     // }
    }


    public class ImageButtonAdapter extends BaseAdapter
    {
      private Context    mContext;

      public LayoutMenuAdapter(Context c)
      {
        mContext = c;
      }

      public int getCount()
      {
        return mThumbIds.length;
      }

      public Object getItem(int position)
      {
        return null;
      }

      public long getItemId(int position)
      {
        return 0;
      }

      public View getView(int position,View convertView,ViewGroup parent)
      {

        /* IF I USE THIS PART EVERYTHING WORKS FINE */

        // ImageView imageView;
        // if (convertView == null) {
        //    imageView = new ImageView(mContext);
        //    imageView.setLayoutParams(new GridView.LayoutParams(100,100));
        //    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        //    imageView.setPadding(0,0);
        //    imageView.setFocusable(false);
        //  } else {
        //    imageView = (ImageView) convertView;
        //  }
        //  imageView.setImageResource(mThumbIds[position]);
        //  return imageView;

        /* IF I USE THIS PART NO THE ACTIVITY/LISTENER RECEIVES NO EVENT */

        ImageButton imageButton;
        if (convertView == null) {
          imageButton = new ImageButton(mContext);
          imageButton.setLayoutParams(new GridView.LayoutParams(100,100));
          imageButton.setScaleType(ImageView.ScaleType.CENTER_CROP);
          imageButton.setPadding(0,0);
          imageButton.setFocusable(false);
        } else {
          imageButton = (ImageButton) convertView;
        }
        imageButton.setImageResource(mThumbIds[position]);
        imageButton.setOnClickListener(new OnClickListener(){

             public void onClick(View arg0) {

                 Log.e(\"onClick()\",position);

        }

         });
        return imageButton;
      }

      // references to images
      private Integer[] mThumbIds = { R.drawable.media};
    }
    ,非常感谢您的帮助,现在我的Activity仅实现了一个OnClickListener wich,它将通过ctor传递到Adapter并绑定到每个按钮:
class MyActivity extends Activity implements OnClickListener {
  ...
  @Override
  public void onCreate() {
    ...
    GridView gridview = (GridView) findViewById(R.id.gridview);
    // gridview.setOnItemClickListener(this); // removed
    gridview.setAdapter(new ImageButtonAdapter(this,this));
  }
  ...    
  @Override
  public void onClick(View view)
  {
    Log.i(\"onClick()\",\"view=\" + view);
  }
}


public class ImageButtonAdapter extends BaseAdapter
{
  private Context    mContext;

  private OnClickListener mListener;

  public LayoutMenuAdapter(Context c,OnClickListener l)
  {
    mContext = c;
    mListener = l;
  }

  public int getCount()
  {
    return mThumbIds.length;
  }

  public Object getItem(int position)
  {
    return null;
  }

  public long getItemId(int position)
  {
    return 0;
  }

  public View getView(int position,ViewGroup parent)
  {
    ImageButton imageButton;
    if (convertView == null) {
      imageButton = new ImageButton(mContext);
      imageButton.setLayoutParams(new GridView.LayoutParams(100,100));
      imageButton.setScaleType(ImageView.ScaleType.CENTER_CROP);
      imageButton.setPadding(0,0);
      imageButton.setFocusable(false);
    } else {
      imageButton = (ImageButton) convertView;
    }
    imageButton.setImageResource(mThumbIds[position]);
    imageButton.setOnClickListener(mListener);
    return imageButton;
  }

  // references to images
  private Integer[] mThumbIds = { R.drawable.media};
}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...