Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GridView自定义BaseAdapter ImageView ImageButton OnItemClick不´;行不通_Android - Fatal编程技术网

Android GridView自定义BaseAdapter ImageView ImageButton OnItemClick不´;行不通

Android GridView自定义BaseAdapter ImageView ImageButton OnItemClick不´;行不通,android,Android,我在将GridView与CustomAdapter(extends BaseAdapter)一起使用时遇到问题 我的活动实现了侦听器 如果我使用ImageView作为项目,一切正常,则会触发/捕获OnItemClick事件 我还没有找到使用ImageButton定制BaseAdapter的GridView的有用示例。 有人有主意吗 片段: class MyActivity extends Activity implements OnItemClickListener { ... @O

我在将GridView与CustomAdapter(extends BaseAdapter)一起使用时遇到问题

  • 我的活动实现了侦听器
  • 如果我使用ImageView作为项目,一切正常,则会触发/捕获OnItemClick事件
我还没有找到使用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, 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, 0, 0);
      imageButton.setFocusable(false);
    } else {
      imageButton = (ImageButton) convertView;
    }
    imageButton.setImageResource(mThumbIds[position]);
    return imageButton;
  }

  // references to images
  private Integer[] mThumbIds = { R.drawable.media};
}
类MyActivity扩展活动实现了McClickListener{
...
@凌驾
public void onCreate(){
...
GridView GridView=(GridView)findViewById(R.id.GridView);
setOnItemClickListener(this);
setAdapter(新的ImageButtonAdapter(this));
}
...    
@凌驾
公共控件单击(AdapterView适配器、视图视图、int arg2、long arg3)
{
Log.e(“onItemClick()”,“arg2=“+arg2+”,arg3=“+arg3”);
}
}
公共类ImageButtonAdapter扩展BaseAdapter
{
私有上下文;
公共布局MenuAdapter(上下文c)
{
mContext=c;
}
public int getCount()
{
返回mThumbIds.length;
}
公共对象getItem(int位置)
{
返回null;
}
公共长getItemId(int位置)
{
返回0;
}
公共视图getView(int位置、视图转换视图、视图组父视图)
{
/*如果我用这个零件,一切都很好*/
//图像视图图像视图;
//if(convertView==null){
//imageView=新的imageView(mContext);
//setLayoutParams(新的GridView.LayoutParams(100100));
//imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
//setPadding(0,0,0,0);
//imageView.setFocusable(false);
//}其他{
//imageView=(imageView)convertView;
//  }
//setImageResource(mThumbIds[position]);
//返回图像视图;
/*如果我使用此部件,则“活动/侦听器”不会收到任何事件*/
图像按钮图像按钮;
if(convertView==null){
imageButton=新的imageButton(mContext);
setLayoutParams(新的GridView.LayoutParams(100100));
imageButton.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
设置填充(0,0,0,0);
imageButton.setFocusable(假);
}否则{
imageButton=(imageButton)转换视图;
}
setImageResource(mThumbIds[position]);
返回图像按钮;
}
//对图像的引用
私有整数[]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, 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, 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};
    }
类MyActivity扩展活动实现了McClickListener{
...
@凌驾
public void onCreate(){
...
GridView GridView=(GridView)findViewById(R.id.GridView);
setOnItemClickListener(this);
setAdapter(新的ImageButtonAdapter(this));
}
...    
//@覆盖
//公共控件单击(AdapterView适配器、视图视图、int arg2、long arg3)
// {
//Log.e(“onItemClick()”,“arg2=“+arg2+”,arg3=“+arg3”);
// }
}
公共类ImageButtonAdapter扩展BaseAdapter
{
私有上下文;
公共布局MenuAdapter(上下文c)
{
mContext=c;
}
public int getCount()
{
返回mThumbIds.length;
}
公共对象getItem(int位置)
{
返回null;
}
公共长getItemId(int位置)
{
返回0;
}
公共视图getView(int位置、视图转换视图、视图组父视图)
{
/*如果我用这个零件,一切都很好*/
//图像视图图像视图;
//if(convertView==null){
//imageView=新的imageView(mContext);
//setLayoutParams(新的GridView.LayoutParams(100100));
//imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
//setPadding(0,0,0,0);
//imageView.setFocusable(false);
//}其他{
//imageView=(imageView)convertView;
//  }
//setImageResource(mThumbIds[position]);
//返回图像视图;
/*如果我使用此部件,则“活动/侦听器”不会收到任何事件*/
图像按钮图像按钮;
if(convertView==null){
imageButton=新的imageButton(mContext);
setLayoutParams(新的GridView.LayoutParams(100100));
imageButton.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
设置填充(0,0,0,0);
imageButton.setFocusable(假);
}否则{
imageButton=(imageButton)转换视图;
}
setImageResource(mThumbIds[position]);
setOnClickListener(新的OnClickListener(){
公共void onClick(视图arg0){
Log.e(“onClick()”,位置);
}
});
返回图像按钮;
}
//对图像的引用
私有整数[]mThumbIds={R.drawable.media};
}

非常感谢您的帮助,现在我的活动只实现了一个OnClickListener,它将通过ctor传递到适配器并绑定到每个按钮:

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, View convertView, 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, 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};
}

你看到了什么样的错误(请发帖)?作为快速概述,这看起来足够了。没有错误消息,侦听器没有按预期工作。这是我自己的一个初学者思维错误,因为监听器绑定到GridView。如果我喜欢使用ImageButtons,OnClickListener必须绑定到每个按钮(见下文)。。。还是非常感谢!