OnItemClickListener не запускается в Android GridView
У меня есть Gridview, заполненный адаптером, который возвращает LinearLayouts, каждый из которых содержит ImageButton и TextView.
В адаптере я привязываю событие onClick и onLongClick к ImageButton.
Я пытаюсь привязать OnItemClickListener к gridview, но я не знаю, почему onItemclicked никогда не запускался.
Это мой шестой час без ничего.
Кстати;
OnItemSelectListener отлично работает на Grid.
Я проверяю, если какой-то фрагмент кода случайно обрабатывает onItemClicked, но не может его уловить.
Мне нужны помощники.
gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null);
gridView.setOnItemClickListener(new ItemClickListener());
.
.
.
//inner handler class
class ItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +
i,Toast.LENGTH_SHORT).show();
}
}
Ответы
Ответ 1
Не используйте кликируемые объекты в сетке. В этом случае Android не сможет обработать событие click GridView
.
Вместо этого используйте что-то, чтобы показать аналогичный вид пользовательского интерфейса. Затем обработайте действия этого объекта click.
Не выполнять: поместить Button
в GridView
для выполнения некоторых действий по щелчку.
Сделайте: поместите ImageView
вместо ImageButton
и обработайте события ImageView
.
Ответ 2
Если вы хотите использовать Button
или ImageButton
, вам необходимо записать эти атрибуты в свой xml-код виджетов.
android:focusable="false"
android:focusableInTouchMode="false"
Его работы для меня.
Но в GridView попробуйте избежать использования этих виджетов. Вместо них вы можете использовать любые другие виджеты (например, ImageView или любые другие).
Ответ 3
Также убедитесь, что ваш ListAdpter возвращает значение true для
public boolean isEnabled (int _position)
для позиции, которую вы хотите щелкнуть.
Ответ 4
Эй, парень, наконец, получил решение...
то, что мы делали, - это прямой доступ к макету внутри GridView, поэтому onItemClickListener сбивает с пути доступ к элементу.
Итак, решение заключается в применении onClickListener внутри адаптера (т.е. обычно ArrayAdapter)
так что я пытаюсь сказать:
public View getView(int position, View convertView, ViewGroup parent) {
//Here row is a view and we can set OnClickListener on this
final View row;
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
//Here we inflate the layout to view (linear in my case)
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.image = (ImageView) row.findViewById(R.id.image);
row.setTag(holder);
} else {
row = convertView;
holder = (ViewHolder) row.getTag();
}
ImageItem item = data.get(position);
holder.imageTitle.setText(item.getTitle());
holder.image.setImageBitmap(item.getImage());
//Now get the id or whatever needed
row.setId(position);
// Now set the onClickListener
row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, "Clicked" + row.getId() + "!!",
Toast.LENGTH_SHORT).show();
}
});
return row;
}
Ответ 5
Отличные решения здесь, но никто не исправил это для меня. Поэтому я хотел поделиться тем, что помогло мне здесь.
fooobar.com/questions/207471/...
Ответ 6
Попробуйте установить
android:clickable="false"
android:focusable="false"
Ответ 7
Я тоже сталкиваюсь с той же проблемой из-за нескольких причин.
Итак, вот мои советы:
- Расширьте BaseAdapter для вашего адаптера;
- Используйте OnClickListener внутри адаптера getView, вместо этого установите OnItemClickListener для GridView;
- Не рекомендуется устанавливать LayoutParams несколько раз;
- Проверьте, что позиция = 0, не используйте convertView, надуйте новый Вид;
- Установите OnClickListener не только для родительского Вид, но для любого дочернего Вид, если таковой имеется;
- Сделайте все ваши Просмотр нажатыми.
Я только что протестировал его на 4 устройствах, и это решение работает так, как ожидалось. Надеюсь, это поможет в вашем случае.
Исправьте меня, если я сделал что-то неправильно.
Формат раскладки XML:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#273238"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:padding="1dp">
<ImageView
android:id="@+id/open_image_item_imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/loh"
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:scaleType="centerCrop"/>
<TextView
android:id="@+id/open_image_item_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_gravity="bottom"
android:padding="4dp"
android:textSize="10sp"
android:ellipsize="start"
android:background="#55000000"
android:textColor="#FFFFFF"
android:text="image name"/>
</FrameLayout>
Код адаптера Java:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
if(convertView != null && position != 0)
view = convertView;
else{
view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false);
view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));
}
TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview);
ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview);
...
View.OnClickListener onClickListener = getOnClickListener(files[position]);
view.setOnClickListener(onClickListener);
textView.setOnClickListener(onClickListener);
imageView.setOnClickListener(onClickListener);
return view;
}