【问题标题】:Create a clickable image in a GridView in Android在 Android 的 GridView 中创建可点击的图像
【发布时间】: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;
}

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

【问题讨论】:

    标签: java android android-gridview clickable-image


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案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)+"]");
        }
    };
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      相关资源
      最近更新 更多