Создание кликабельного изображения в GridView на Android
У меня есть изображения, отображаемые в GridView, как в этот учебник. Я хочу, чтобы иметь возможность нажимать на одно изображение и делать другие события, и мне нужно знать, какое изображение было нажато.
Нужно ли добавлять ImageView.onKeyDown(keyCode, event) в класс ImageAdapter? Вот код, который в настоящее время существует:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// if it 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)
где вы получаете позицию элемента в сетке, которая была нажата, и вид, который находится внутри ячейки сетки. Это то, что вам нужно?
Ответ 2
Мне удалось получить позицию щелкнутого изображения, сделав позицию окончательной и добавив слушателя onClick к imageView. Это регистрирует позицию изображения, которое было нажато.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// if it 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
Я попробовал вышеупомянутый метод getView (конечная позиция int...)
понял, что позиция получила "reset" после 28 пунктов и позицию, когда она возвращается к 0 после 28-го элемента в gridview.
Я подозревал, что последнее ключевое слово создает проблему, и после его удаления я смог получить позиции, как ожидалось.
Ниже приведен пример кода с событием клика, вызываемым в действии, которое демонстрирует gridview.
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)+"]");
}
};
}