Подтвердить что ты не робот

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();
    }
}
4b9b3361

Ответ 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;
    }