OnItemClickListener не запускается на Android GridView - PullRequest
28 голосов
/ 18 ноября 2011

У меня есть Gridview, заполненный адаптером, который возвращает LinearLayouts, каждый из которых содержит ImageButton и TextView.

В адаптере я связываю события onClick и onLongClick с ImageButton.

Я пытаюсь привязать OnItemClickListener к сетке, но я не знаю, почему щелчок onItemclicked никогда не запускался.

Это мой 6-й час без всего.

Кстати; 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();
    }
}

Ответы [ 6 ]

78 голосов
/ 21 ноября 2011

Не используйте интерактивные объекты в сетке.В этом случае Android не может обработать событие нажатия GridView.

. Вместо этого используйте что-то, чтобы отобразить аналогичное представление пользовательского интерфейса.Затем обработайте действия щелчка этого объекта.

Не: вставьте Button в GridView, чтобы выполнить некоторые действия щелчка.

Выполните: поставить ImageView вместо ImageButton и обработать ImageView события нажатия.

13 голосов
/ 21 ноября 2014

Если вы хотите использовать Button или ImageButton, тогда вам нужно записать эти атрибуты в ваш xml-код виджетов.

android:focusable="false"
android:focusableInTouchMode="false"

Это работает для меня.

Но в GridView старайтесь избегать использования этих виджетов.Вместо них вы можете использовать любые другие виджеты (например, ImageView или любой другой).

3 голосов
/ 29 декабря 2012

Также убедитесь, что ваш ListAdpter возвращает true для

public boolean isEnabled (int _position)

для позиции, которую вы хотите щелкнуть.

1 голос
/ 22 апреля 2016

Попробуйте установить

    android:clickable="false"
    android:focusable="false"
1 голос
/ 22 января 2014

Эй, парень, наконец-то пришло решение ...

то, что мы делали, - это прямой доступ к макету внутри 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;
}
0 голосов
/ 06 ноября 2017

У меня тоже такая же проблема, по нескольким причинам.Итак, вот мои советы:

  1. Расширение BaseAdapter для вашего адаптера;
  2. Используйте OnClickListener внутри getView в адаптере вместо установки OnItemClickListener для GridView ;
  3. Избегайте установки LayoutParams несколько раз;
  4. Проверить, если позиция = 0, не использовать convertView, накачать новый Просмотр ;
  5. Установить OnClickListener не только дляродитель просмотр , но для любого ребенка просмотр , если есть;
  6. Сделайте все ваши View s интерактивными.

Я только что протестировал его на 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;
    }
...