Java 在Android的GridView中创建可点击的图像

Java 在Android的GridView中创建可点击的图像,java,android,android-gridview,clickable-image,Java,Android,Android Gridview,Clickable Image,我将图像显示在GridView中,如中所示。我想能够点击一个图像并进行其他活动,我需要知道点击了哪个图像 @Override public View getView(final int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // if it's not recycled, initialize some attributes

我将图像显示在GridView中,如中所示。我想能够点击一个图像并进行其他活动,我需要知道点击了哪个图像

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
  ImageView imageView;
  if (convertView == null) {  
    // if it's not recycled, initialize some attributes
    imageView = new ImageView(mContext);
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8);


    imageView.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View view) {
        Log.d("onClick","position ["+position+"]");
      }

    });

  } 
  else {
    imageView = (ImageView) convertView;
  }

  imageView.setImageResource(mThumbIds[position]);
  return imageView;
}
是否必须在ImageAdapter类中添加imageView.onKeyDown(keyCode,event)?以下是当前存在的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  ImageView imageView;
  if (convertView == null) {  
    // if it's not recycled, initialize some attributes
    imageView = new ImageView(mContext);
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8);
    //does this need imageView.onKeyDown(keyCode, event)?
  } 
  else {
    imageView = (ImageView) convertView;
  }

  imageView.setImageResource(mThumbIds[position]);
  return imageView;
}

它将如何指示单击的图像?如何创建合适的处理程序?

我可以通过将位置设置为最终位置并向imageView添加onClick侦听器来获取单击图像的位置。这将记录单击的图像的位置

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
  ImageView imageView;
  if (convertView == null) {  
    // if it's not recycled, initialize some attributes
    imageView = new ImageView(mContext);
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8);


    imageView.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View view) {
        Log.d("onClick","position ["+position+"]");
      }

    });

  } 
  else {
    imageView = (ImageView) convertView;
  }

  imageView.setImageResource(mThumbIds[position]);
  return imageView;
}

对于GridView,您可以使用setOnItemClickListener方法来拥有OnItemClickListener侦听器。该侦听器将为您提供一个必须用签名重写的方法

onItemClick(AdapterView<?> parent, View v, int position, long id)
onItemClick(AdapterView父视图、视图v、int位置、长id)

您可以从中获取已单击的项目在网格中的位置以及网格单元格内的视图。这就是您需要的吗?

我尝试了上述方法getView(最终int位置…) 实现了位置在gridview中的28项之后被“重置”,并且在第28项之后返回到0时的位置

我怀疑最后一个关键词造成了问题,在删除它后,我能够获得预期的职位

下面是在显示gridview的活动中调用click事件的示例代码

public class MainActivity extends Activity {

ArrayList<Integer> item_ids = new ArrayList<Integer>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    item_ids = //get your item ids method

    GridView gridview = (GridView) findViewById(R.id.grid_featured);
    gridview.setAdapter(new ImageAdapter(this));
    gridview.setOnItemClickListener(itemClickListener);

    footer = (Footer)findViewById(R.id.layoutFooter);
    footer.setActivity(this);
}

private OnItemClickListener itemClickListener = new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    Log.d(TAG,"Position Clicked ["+position+"] with item id ["+item_ids.get(position)+"]");
    }
};
公共类MainActivity扩展活动{
ArrayList项_id=新建ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
item_id=//获取您的item id方法
GridView GridView=(GridView)findviewbyd(R.id.grid\u);
setAdapter(新的ImageAdapter(this));
setOnItemClickListener(itemClickListener);
页脚=(页脚)findViewById(R.id.layoutFooter);
footer.setActivity(此);
}
私有OnItemClickListener项ClickListener=新建OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
Log.d(标记,“位置单击[”+位置+“],项目id为[“+项目id.get(位置)+“])”;
}
};

}

这不是你想要的做事方式。相反,使用亚历杭德罗斯方法。它更简洁,不涉及更改方法签名。与此相反,请参阅,它显示了使用gridView.setOnItemClickListener的代码,如Alejandro所述。(如果试图在回答中使用此解决方案,则会提到一个bug。)有关此方法的更多详细代码,请参阅。