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

Posted

技术标签:

【中文标题】在 Android 的 GridView 中创建可点击的图像【英文标题】:Create a clickable image in a GridView in Android 【发布时间】:2010-10-18 20:06:15 【问题描述】:

我在 GridView 中显示图像,如 this tutorial。我希望能够单击单个图像并执行其他事件,并且我需要知道单击了哪个图像。

我必须在 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;

它将如何指示点击了哪个图像?如何创建正确的处理程序?

【问题讨论】:

【参考方案1】:

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

onItemClick(AdapterView<?> parent, View v, int position, long id)

您可以在哪里获得被点击的网格中项目的位置以及网格单元格内的视图。这是你需要的吗?

【讨论】:

请参阅Jianhong's answer,了解此方法的更详细代码。【参考方案2】:

通过将位置设为最终位置并向 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;

【讨论】:

这不是你想做的事情。而是使用 Alejandros 方法。它更简洁,并且不涉及您更改方法签名。 而不是这个,请参阅Jianhong's answer,它显示了使用 Alejandro 描述的 gridView.setOnItemClickListener 的代码。 (如果尝试在此答案中使用该解决方案,则会提到一个错误。)【参考方案3】:

我试过上面提到的方法getView(final int position . . .) 意识到位置在 28 个项目后“重置”,并且在 gridview 中的第 28 个项目后回到 0 时的位置。

我怀疑 final 关键字造成了问题,删除它后我能够按预期获得位置。

下面是一个示例代码,其中在展示 gridview 的 Activity 中调用了 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)+"]");
    
;

【讨论】:

以上是关于在 Android 的 GridView 中创建可点击的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中创建可编辑的表格视图?

如何在颤动中创建可滚动的行

如何在 Bootstrap 中创建可滚动的列?

如何在 uiimagepickercontroller 中创建可裁剪的横幅图像?

如何在 PyQt 中创建可折叠的盒子

如何在 Serilog 输出模板中创建可选属性?