2009-04-10 2 views
11

this tutorial과 같이 GridView에 이미지가 표시됩니다. 단일 이미지를 클릭하고 다른 이벤트를 수행 할 수 있기를 원하며 클릭 한 이미지를 알아야합니다.안드로이드의 GridView에서 클릭 가능한 이미지 만들기

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; 
} 

어떤 이미지가 클릭 되었습니까? 적절한 핸들러는 어떻게 작성합니까?

답변

24

GridView의 경우 setOnItemClickListener 메서드를 사용하여 OnItemClickListener 수신기를 가질 수 있습니다. 그 청취자는 당신에게 당신이 서명하면 클릭 된 표에서 항목의 위치 및 그리드의 셀 안에보기를 얻을

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

로 오버라이드 (override) 할 필요가하는 방법을 제공 할 것입니다. 그게 네가 필요한거야?

+0

이 접근법에 대한 자세한 코드는 [Jianhong 's answer] (http://stackoverflow.com/a/5789159/199364)를 참조하십시오. – ToolmakerSteve

6

마지막 위치를 지정하고 onClick 리스너를 imageView에 추가하여 클릭 한 이미지의 위치를 ​​가져올 수있었습니다. 클릭 한 이미지의 위치가 기록됩니다.

@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; 
} 
+3

이것은 당신이 일을 할 방법이 아니다. 대신 Alejandros 방법을 사용하십시오. 그것은 훨씬 더 깔끔하고 메서드 서명을 변경하는 것을 포함하지 않습니다. –

+0

대신 알레한드로가 설명한대로 gridView.setOnItemClickListener를 사용하기위한 코드를 보여주는 [Jianhong의 대답] (http://stackoverflow.com/a/5789159/199364)을 참조하십시오. (이 답변에서 솔루션을 사용하려고 시도하면 버그에 대해 언급합니다.) – ToolmakerSteve

6

나는 위에서 언급 한 방법을 시도했다. getView (final int position ....) 은 28 개 항목 후에 위치가 "재설정"되고 position이 28 번째 항목 이후에 0으로 돌아 갔을 때 gridview에서 깨달았다.

나는 최종 키워드가 문제를 만들고있는 것으로 의심하고 그것을 제거한 후에 나는 예상대로 위치를 얻을 수 있었다.

다음은 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)+"]"); 
    } 
}; 

}